地图中的地图?使用两个数据框列表中的列

Map within Map? Working with columns within two lists of dataframes

我在 R 中工作,有两个数据帧列表。我需要在 list1 中的数据框中添加一列,其中填充了从 list2 中相应数据框中获取的值。我想我需要 Map 内的 Map,或 Map 内的 lapply,但我只单独使用过 Map 和 lapply,或 lapply 内的 lapply,所以我我无法对正确的代码进行排序。下面的列表与我正在使用的类似。

dfa<-data.frame(tom=sample(seq(as.Date("2020-01-01"),as.Date("2020-03-01"), 1), 20), id=seq(1:20))
dfb<-data.frame(tom=sample(seq(as.Date("2020-01-01"),as.Date("2020-02-01"), 1), 32), id=seq(1:32))
list1<-list(dfa, dfb)

df1<-data.frame(date=seq(as.Date("2020-01-01"), as.Date("2020-03-01"), 1),num=sample(1:200, 61))
df2<-data.frame(date=seq(as.Date("2020-01-01"), as.Date("2020-03-01"), 1),num=sample(4:200, 61))
list2<-list(df1, df2)

我试过的代码可能接近或完全偏离标记。我正在尝试将新列 "d1" 添加到 list1 中的所有数据帧。 d1 中的值应从 list2 的数据框中的变量 "num" 中提取,其中日期与 list1 中数据框中的日期相匹配。

list3<-Map(function(x, y){
           Map(function(v, w){
               v<-cbind(v, d1=w[w$date==v, w$num])}, x$tom, y)},list1, list2)

这只是 returns 关于使用原子向量的错误:"Error in w$date : $ operator is invalid for atomic vectors"

但是如果我把它改成索引...

list3<-Map(function(x, y){
       Map(function(v, w){
           v<-cbind(v, d1=w[w[,1]==v, w[,2]])}, x$tom, y)}, list1, list2)

也不开心:"Error in [.default(w, , 1) : incorrect number of dimensions"

至此,我有点忘记了我在最内层函数中尝试引用的内容以及如何正确引用它。这是否接近我想要的?

我们可以使用merge

Map(function(dat1,  dat2)  merge(dat1, dat2, by.x = 'tom',
        by.y = 'date', all.x = TRUE), list1, list2)

如果我们需要重命名列

Map(function(dat1,  dat2)  {
    out <- merge(dat1, dat2, by.x = 'tom', by.y = 'date', all.x = TRUE)
    names(out)[3] <- 'd1'
    out}, 
       list1, list2)