【问题标题】:How to apply a function to dataframes within a list?如何将函数应用于列表中的数据框?
【发布时间】:2021-03-06 11:22:23
【问题描述】:

对于这个数据:

list_data1 <- data.frame(date=c("Jan", "Feb", "Mar"), X0=c(3, 9, 5, 1, -2, 8),
                         X1=c(3, 9, 5, 1, -2, 8), mod=c("mod", "mod", "mod"))
list_data2 <- data.frame(date=c("Jan", "Feb", "Mar"), X0=c(3, 9, 5, 1, -2, 8),
                         X1=c(3, 9, 5, 1, -2, 8), mod=c("mod", "mod", "mod"))
merged.list <- list(list_data1, list_data2)

我需要将值 X0 和 X1 替换为 X0 - mean(X0[1:3])X1 - mean(X1[1:3])

我还有其他列 X2、X3 等,所以我想将函数应用于除 mod 和 date 之外的所有列。

【问题讨论】:

    标签: r list dataframe nested-lists


    【解决方案1】:

    您可以在数字列上使用rapply

    FUN <- function(x) x - mean(x[1:3])
    r <- rapply(merged.list, f=FUN, classes="numeric", how="replace")
    r
    # [[1]]
    #   date         X0         X1 mod
    # 1  Jan -2.6666667 -2.6666667 mod
    # 2  Feb  3.3333333  3.3333333 mod
    # 3  Mar -0.6666667 -0.6666667 mod
    # 4  Jan -4.6666667 -4.6666667 mod
    # 5  Feb -7.6666667 -7.6666667 mod
    # 6  Mar  2.3333333  2.3333333 mod
    # 
    # [[2]]
    #   date         X0         X1 mod
    # 1  Jan -2.6666667 -2.6666667 mod
    # 2  Feb  3.3333333  3.3333333 mod
    # 3  Mar -0.6666667 -0.6666667 mod
    # 4  Jan -4.6666667 -4.6666667 mod
    # 5  Feb -7.6666667 -7.6666667 mod
    # 6  Mar  2.3333333  2.3333333 mod
    

    【讨论】:

    • 没想到rapply(),不错!
    • 两个答案都很好。我应该接受哪一个?
    【解决方案2】:

    您可以使用lapply()

    代码

    lapply(merged.list, function(z){
      # X0 - mean(X0[1:3])
      z[, "X0"] <- z[, "X0"] - mean(z[, "X0"][1:3])
    
      # X1 - mean(X1[1:3])
      z[, "X1"] <- z[, "X1"] - mean(z[, "X1"][1:3])
    
      # return df
      z
    })
    
    # [[1]]
    #   date         X0         X1 mod
    # 1  Jan -2.6666667 -2.6666667 mod
    # 2  Feb  3.3333333  3.3333333 mod
    # 3  Mar -0.6666667 -0.6666667 mod
    # 4  Jan -4.6666667 -4.6666667 mod
    # 5  Feb -7.6666667 -7.6666667 mod
    # 6  Mar  2.3333333  2.3333333 mod
    
    # [[2]]
    #   date         X0         X1 mod
    # 1  Jan -2.6666667 -2.6666667 mod
    # 2  Feb  3.3333333  3.3333333 mod
    # 3  Mar -0.6666667 -0.6666667 mod
    # 4  Jan -4.6666667 -4.6666667 mod
    # 5  Feb -7.6666667 -7.6666667 mod
    # 6  Mar  2.3333333  2.3333333 mod
    
    

    更新

    如果您想将计算应用于data.frame() 中的所有数字列

    lapply(merged.list, function(z){
      # select all numeric columns
      tmp1 <- z[, sapply(z, is.numeric)]
      
      # do calcs
      tmp2 <- sapply(tmp1, function(x){
        x - mean(x[1:3])
      })
      
      # reassign to original data.frames
      z[, sapply(z, is.numeric)] <- tmp2
      
      # return
      z
    })
    

    【讨论】:

    • 两个答案都很好。我应该接受哪一个?
    • @Tpellirn 接受您最喜欢的答案,这完全取决于您。但是,如果我是你,我可能会接受 Jay 的回答,因为它更易于阅读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多