2017-03-28 5 views
0

Ich habe eine Liste L von Datenrahmen, wobei jeder Datenrahmen aus der Variablen Var und einer Beobachtung besteht, die aus verschiedenen Zahlen besteht. Jede Nummer in jeder Beobachtung gehört zur Menge {1,2,3,4,5,11,12,13,14,15}. L könnte, als Beispiel wie folgt aussehen:Suchen von Mustern in einer Liste von Datenrahmen mit R

> L 
[[1]] 
        Var 
1 "3", "11", "1", "15", 

[[2]] 
        Var 
1 "5", 13", "3", "12", 

[[3]] 
        Var 
1 "4", "1", "2", "5", 

Das Problem habe ich folgendes zu lösen versuche ist. Ich möchte wissen, ob es eine positive Zahl x = {1,2,3,4,5} gibt, so dass diese Beobachtung, wenn sie jeder Zahl in einer gegebenen Beobachtung hinzugefügt wird, einer anderen gleichwertig wird. Betrachten wir zum Beispiel die ersten 2 Elemente L und lassen x=2 dann x auf das erste Element der L Ausbeuten Zugabe:

> L[[1]] 
        Var 
1 "5", "13", "3", "17", 

Die Zahl 17 nicht die Bedingungen der oben definierten Satz nicht erfüllt. Ich möchte, dass die folgenden Einschränkungen auf x gelten. Lassen Sie y eine Zahl in einem Obs bezeichnen. in einem Datenrahmen von L:

if y + x > 15 then subtract 5 
if 5 < y + x < 11 then subtract 5 

Das gleiche Beispiel mit diesen Randbedingungen ergeben würde:

> L[[1]] 
        Var 
1 "5", "13", "3", "12", 

Und L[[1]] würde L[[2]] äquivalent werden. In meiner Welt teilen L[[1]] und L[[2]] das gleiche Muster. Was ich tun möchte ist, Elemente von L basierend auf äquivalenten (in dem oben beschriebenen Sinn) Mustern zu vergleichen und die Gruppen gemäß "der Anzahl der Mitglieder" zu sortieren. Im Beispiel hier möchte ich feststellen, dass L[[1]] und L[[2]] in einer Gruppe sind und dass dies die Gruppe mit den meisten Mitgliedern ist, gefolgt von der nächsten Gruppe, die in diesem Beispiel nur aus L[[3]] besteht. Ich bin sehr neu in R und jede Führung wäre willkommen!

+0

Normalisieren Sie Ihre Daten, indem Sie das Minimum jeder Zeile subtrahieren? –

Antwort

1

Es sieht so aus, als ob Ihre "Constraints" eine mathematische Äquivalenzrelation definieren. Das bedeutet, dass Ihre Gruppen wirklich Äquivalenzklassen im mathematischen Sinne sind und dass Sie für jede Gruppe einen eindeutigen Repräsentanten definieren können. Wenn Sie dies tun, können Sie leicht nach Äquivalenz suchen (= Elemente, die zur selben Gruppe gehören), indem Sie ihre Repräsentanten vergleichen.

Lassen Sie uns den Repräsentanten als das Element in Ihrer Äquivalenzklasse definieren, das mit "1" beginnt, d. H. Für jedes Listenelement fügen wir die Ganzzahl in 1:5 Ihren definierten Bedingungen hinzu, sodass das erste Element gleich eins ist. Wir können das für jedes Element in Ihrer Liste tun L und dann vergleichen, welche Elemente denselben Vertreter haben.

Implementierung in R:

Lassen Sie uns mit Ihrer Liste beginnen L:

L <- list(structure(list(Var = c("3", "11", "1", "15")), .Names = "Var", 
       row.names = c(NA, -4L), class = "data.frame"), 
     structure(list(Var = c("5", "13", "3", "12")), .Names = "Var", 
       row.names = c(NA, -4L), class = "data.frame"), 
     structure(list(Var = c("4", "1", "2", "5")), .Names = "Var", 
       row.names = c(NA, -4L), class = "data.frame")) 

Erstens haben wir die Liste vereinfachen, indem sie in eine Liste von numerischen Vektoren Umwandlung:

## Simplify list: convert to list of numerical vectors: 
L2 <- lapply(L, function(x) as.numeric(x$Var)) 

> L2 
[[1]] 
[1] 3 11 1 15 

[[2]] 
[1] 5 13 3 12 

[[3]] 
[1] 4 1 2 5 

Dann Wir definieren die Funktion, um die Addition durchzuführen, folgen Ihren Einschränkungen und finden den Repräsentanten für jedes Element:

## Function to implement the addition rules: 
addConstant <- function(myVec, constant){ 
    outVec <- myVec + constant 
    outVec <- ifelse(((outVec > 5) & (outVec < 11)) |(outVec > 15), 
     outVec - 5, outVec) 
} 

## Define representative of equivalence class as the one starting with a "1": 
representativesList <- lapply(L2, function(myVec) addConstant(myVec, 6 - myVec[1])) 

> representativesList 
[[1]] 
[1] 1 14 4 13 

[[2]] 
[1] 1 14 4 13 

[[3]] 
[1] 1 3 4 2 

Jetzt können wir die Gruppen definieren, in Ihrem Beispiel gibt es zwei Gruppen. Wir werden sie group1 anrufen und group2:

## Define groups: Unique representatives: 
groupList <- unique(representativesList) 
names(groupList) <- paste0("group", seq(along = groupList)) 

> groupList 
$group1 
[1] 1 14 4 13 

$group2 
[1] 1 3 4 2 

Schließlich überprüfen wir, welche Gruppe jede Beobachtung gehört:

## Find group: 
groupAffiliationVec <- vapply(representativesList, function(x){ 
      flagVec <- vapply(groupList, function(y, x) identical(x,y), logical(1), x) 
      names(groupList[flagVec])   
     }, character(1)) 

> groupAffiliationVec 
[1] "group1" "group1" "group2" 

Wir wissen jetzt, dass Beobachtungen 1 und 2 Belog zur gleichen Gruppe (group1) und diese Beobachtung 3 gehört zu group1. Mit table(groupAffiliationVec) können Sie die Anzahl der Mitglieder für jede Gruppe berechnen.

+0

Wie können wir das so einstellen, dass auch die Elemente von 'L' berücksichtigt werden, die mit einer Zahl' n = {11,12,13,14,15} 'beginnen? Vielen Dank! – CHRD

+0

Sie haben Recht, ich habe das nicht berücksichtigt. Sie könnten den Repräsentanten als Element definieren, das mit "1" beginnt, wenn das erste Element in {1,2,3,4,5} ist, oder mit "11" beginnen, wenn das erste Element in {11,12,13,14 ist ,15}. lapply (L2, Funktion (myVec) { \t \t \t if (myVec [1] <11) { \t \t \t - 'representativesList <: Alles, was Sie die Definition von' 'representativesList mit folgendem zu tun haben würde, ist ersetzen \t addConstant (myVec, 6 - myVec [1]) \t \t \t} else { \t \t \t \t addConstant (myVec, 16 - myVec [1]) \t \t \t} \t \t \t \t \t}) ' – ikop

Verwandte Themen