1

我有一个列表列表,每个列表都有相同的结构。每个子列表中的元素之一是键值。我想向每个子列表添加一个新元素,它是包含匹配键值的数据框的行。我认为这基本上就像“合并”,除了一个列表。

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

#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 行数据框作为单个列表元素放置)。

有没有更简单的方法来做到这一点?

4

1 回答 1

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
于 2012-11-18T00:02:58.773 回答