【问题标题】:Map within Map? Working with columns within two lists of dataframes地图内的地图?使用两个数据框列表中的列
【发布时间】:2020-09-16 12:08:48
【问题描述】:

我在 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) 中的错误:维数不正确”

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

【问题讨论】:

    标签: r dictionary lapply mapply


    【解决方案1】:

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

    【讨论】:

    • 哦,这太聪明了,比我走的路要好得多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2021-06-08
    • 2016-06-05
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多