我创建了一个空列表,我需要在数据框中填充名称。如果我有一个名称,它运行正常,但如果有多个名称,它会抛出错误:“要替换的项目数不是替换长度的倍数”
我知道这意味着我有两件或更多件我试图放入列表元素,但根据我在列表中读到的所有内容,“你可以在列表中存储任何东西”。所以我知道我正在做一些愚蠢的事情,但我无法弄清楚如何到达我需要去的地方。
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
}
我错过了哪些可以让我在列表中添加可变数量的名字?一旦我构建了列表,我就需要在另一个操作中迭代地使用每个元素,首先计算给定元素中的名称。
答案 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]