首页 > 解决方案 > 地图内的地图?使用两个数据框列表中的列

问题描述

我在 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)

这只是返回有关使用原子向量的错误:“w$date 中的错误:$ 运算符对原子向量无效”

但是,如果我将其更改为索引...

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

它也不高兴:“ [.default(w, , 1) 中的错误:维数不正确”

至此,我有点忘记了我试图在最里面的函数中引用的内容以及如何正确引用它。这甚至接近我想要的吗?

标签: rdictionarylapplymapply

解决方案


我们可以使用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)

推荐阅读