基于键值将数据框与列表列表合并的有效方法

时间:2012-11-17 23:30:13

标签: r

我有一份清单清单,每个清单都有相同的结构。每个子列表中的一个元素是键值。我想在每个子列表中添加一个新元素,它是包含匹配键值的数据帧的行。我认为这基本上就像'合并',只有一个列表。

所以我的列表和数据框看起来像这样

#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的每个元素,$newDatad的相应行。请注意,我们可以假设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行数据帧作为单个列表元素放置。)

有更简单的方法吗?

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