2017-02-01 44 views
0

我創建了一個空列表,我需要使用數據框中的名稱進行填充。如果我有一個名稱,它運行良好,但是如果有多個名稱,則會引發錯誤:「要替換的項目數不是替換長度的倍數」將不同長度的元素添加到R中的列表中

我知道它意味着我有我試圖放入列表元素中的2個或更多項目,但根據我在列表中閱讀的所有內容,「您可以將任何內容存儲在列表中」。所以我知道我正在做一些頭腦發熱的事情,但我無法弄清楚如何找到我需要去的地方。

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 
} 

我錯過了什麼,將允許我將可變數量的名稱添加到列表中?一旦我建立了列表,我需要在另一個操作中迭代使用每個元素,首先在給定元素內計算名稱。

回答

2

mlist[i] = x2更改爲mlist[[i]] = x2。在list中,[是子列表,而[[是單個元素。


另一種方式來獲得相同的結果:

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

謝謝格雷戈爾。我之前做過(我認爲),因爲我知道你必須訪問單個元素,但其他地方一定是錯誤的,因爲它不起作用。但現在它是完美的! –

+0

該死!打敗我吧。 –

相關問題