我有一份清单清单,每个清单都有相同的结构。每个子列表中的一个元素是键值。我想在每个子列表中添加一个新元素,它是包含匹配键值的数据帧的行。我认为这基本上就像'合并',只有一个列表。
所以我的列表和数据框看起来像这样
#Define the list of lists and the data frame
l <- list()
l[[1]] <- list(i=1, data=1:5)
l[[2]] <- list(i=2, data=runif(5))
l[[3]] <- list(i=1, data=rnorm(5))
d <- data.frame(i=c(1, 2), val1=c(TRUE, FALSE), val2 = c("a", "b"))
我想结束
> l_mod[[1]]
$i
[1] 1
$data
[1] 1 2 3 4 5
$newData
val1 val2
TRUE a
依据l_mod
的每个元素,$newData
为d
的相应行。请注意,我们可以假设d
的每一行都有d$i
的唯一值。
我目前的做法是编写匹配函数并从lapply
matchingRow <- function(indexValue, df) {
return(df[df$i==indexValue, -1])
}
l_mod <- lapply(l, function(x) c(x, newData=matchingRow(x$i, d)))
这基本上有效,但似乎过于复杂。 (它还将d
的每一列拆分为新列表的单独元素;我宁愿将整个1行数据帧作为单个列表元素放置。)
有更简单的方法吗?
答案 0 :(得分:3)
没有特别的种子。看起来很好,只需要取出额外的函数调用。:
l_mod2 <- lapply(l, function(x) list(x, newData=d[d$i==x$i, -1]))
l_mod2[[3]]
[[1]]
[[1]]$i
[1] 1
[[1]]$data
[1] -0.109289881 -0.577508057 1.416671342 -1.130346543 -0.002256123
$newData
val1 val2
1 TRUE a