2017-02-01 3 views
0

Ich habe eine leere Liste erstellt, die ich mit Namen aus einem Datenrahmen füllen muss. Wenn ich einen einzigen Namen habe, läuft es gut, aber wenn es mehrere Namen gibt, wirft es den Fehler: "Anzahl der zu ersetzenden Elemente ist kein Vielfaches der Ersatzlänge"Hinzufügen verschiedener Längenelemente zu einer Liste in R

Ich bekomme, dass es bedeutet, dass ich habe 2 oder mehr Elemente, die ich in das Listenelement einfügen möchte, aber nach allem, was ich in Listen gelesen habe, "kann man alles in einer Liste speichern". Also weiß ich, dass ich etwas bonehead mache, aber ich kann mir nicht vorstellen, wie ich dorthin komme, wo ich hingehen muss.

df <- structure(list(V1 = c("50.strata1", "50.strata1+strata2", "50.strata2* strata4"), 
V2 = c("strata1.50", "strata1.50", "strata2.50"), V3 = c(NA, "strata2.50", "strata4.50"), V4 = c(NA, NA, "st2st4.50")), 
.Names = c("V1", "V2", "V3", "V4"), row.names = c(1L, 2L, 3L), class = "data.frame") 

mlist <- vector("list",nrow(df)) # create the list 
names(mlist) <- df[,1]    # name the elements because I'll need to be able to call them intuitively later 

for(i in 1:nrow(df)){    
x1 = unname(unlist(df[i,2:4])) # pull the last three columns of the dataframe 
x2 = x1[!is.na(x1)]    # strip NA so only left with names 
mlist[i] = x2     # add to the empty list element 
} 

Was fehlt mir, damit ich die variable Anzahl von Namen zu der Liste hinzufügen kann? Sobald ich die Liste erstellt habe, muss ich jedes Element iterativ in einer anderen Operation verwenden, beginnend mit dem Zählen der Namen innerhalb eines bestimmten Elements.

Antwort

2

Ändern Sie mlist[i] = x2 zu mlist[[i]] = x2. In einer list ist [ eine Unterliste, während [[ ein einzelnes Element ist.


Ein anderer Weg, um das gleiche Ergebnis zu erhalten:

mlist2 = apply(df[, 2:4], 1, function(x) unname(x[!is.na(x)])) 
names(mlist2) = df[, 1] 
+1

Sie Gregor Dank. Ich tat das früher (ich dachte), weil ich wusste, dass Sie auf das einzelne Element zugreifen mussten, aber etwas anderes musste anderswo falsch gewesen sein, weil es nicht funktionierte. Jetzt ist es aber perfekt! –

+0

Darn! Beat mich dazu. –

Verwandte Themen