【发布时间】:2016-06-04 17:20:57
【问题描述】:
我有一个 list 和 lists 和 vectors,如下所示:
myList = list(id1 = list(a=6:10,b=1:5),
id2 = list(a=3:8,b = 4:9))
我想用任意function(例如mean、sum等)处理每个列表中名为“b”的第二个vector,并将结果附加到名为@987654329的第三个@ 在每个嵌套的 list 内实现类似:
myList2 = list(id1 = list(a=6:10,b=1:5,c = mean(1:5)),
id2 = list(a=3:8,b = 4:9,c = mean(4:9)))
因此,我的问题分为两部分。首先,如何在每个嵌套的list 中只处理第二个名为vector 的?其次,如何将结果附加到每个嵌套的list?
我知道我可以编写一个始终索引myList[[i]][[2]] 的for 循环,但我正在寻找一个矢量化解决方案。我尝试过使用各种组合apply-family 和匿名function,首先测试vector 的名称,例如:
rapply(myList, function(x) ifelse(names(x) == "b",
print("yes"), #process vector
print("no")), #move on to next x
how = "list"
)
但结果没有多大意义。
附加信息:我使用嵌套的 lists 而不是 data.frame,因为我对每个 id 没有相同数量的观察,但我愿意接受可能绕过这些问题并适应的替代方法观察次数不同。
【问题讨论】:
-
作为这种嵌套“列表”的替代方案,您可以考虑使用“长格式”“data.frame”,例如,从
dat = do.call(rbind, Map(cbind, id = names(myList), lapply(myList, stack)))获得——然后,您可以使用聚合操作喜欢aggregate(values ~ id, dat[dat$ind == "b", ], mean)