将不同长度的元素添加到R中的列表中

时间:2017-02-01 22:27:53

标签: r list

我创建了一个空列表,我需要在数据框中填充名称。如果我有一个名称,它运行正常,但如果有多个名称,它会抛出错误:“要替换的项目数不是替换长度的倍数”

我知道这意味着我有两件或更多件我试图放入列表元素,但根据我在列表中读到的所有内容,“你可以在列表中存储任何东西”。所以我知道我正在做一些愚蠢的事情,但我无法弄清楚如何到达我需要去的地方。

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
}

我错过了哪些可以让我在列表中添加可变数量的名字?一旦我构建了列表,我就需要在另一个操作中迭代地使用每个元素,首先计算给定元素中的名称。

1 个答案:

答案 0 :(得分: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]