【问题标题】:Add a new column on multiple dataframes using mutate使用 mutate 在多个数据帧上添加新列
【发布时间】:2019-11-29 09:57:26
【问题描述】:

我是 R 的新用户。

我有一堆这样的数据框:

 Date         ID    Value conversion
1 2018-07-16  123450  617     10
2 2018-07-23  123450  476     20
3 2018-07-30  123450  44.6     30
4 2018-08-06  123450  248     10  
5 2018-08-13  123450  177     40 

所有数据框都有这样的名称模式:

df_1
df_2
df_3

我需要添加一列来计算“转化权重”,这意味着该列将每一行的转化除以转化列的总和(在上面的示例中为 100) .我的目的是稍后计算每个数据帧的加权标准差。 所以,理想情况下,结果应该是这样的,希望结果也可以导出为环境中的数据框(也可以替换原来的):

 Date         ID    Value conversion  weight
1 2018-07-16 123450  617     10        0.1
2 2018-07-23 123450  476     20        0.2
3 2018-07-30 123450  44.6    30       0.3
4 2018-08-06 123450  248     10        0.1
5 2018-08-13 123450  177     30        0.3

我试图重现 Apply changes (group by) on multiple dataframes using for loop 的结果

但我收到错误消息:“没有适用于 'mutate_' 的方法应用于类列表对象”。但不确定如何使用 dplyr 或 for 循环或数据框列表来做到这一点..

谢谢!

编辑

当我得到结果(数据框列表)时,我这样做了: list2env(list ,envir=.GlobalEnv) 但是,我有错误:

  names(x) must be a character vector of the same length as x 

有谁知道我该如何解决这个问题? 非常感谢!

【问题讨论】:

    标签: r dataframe for-loop dplyr


    【解决方案1】:

    假设这是您的数据框:

    df1 <- data.frame(Date = c("2018-07-16","2018-07-23","2018-07-30","2018-08-06","2018-08-13"),
                      ID = c(123450,123450,123450,123450,123450),
                      Value = c(617,467,44.6,248,177),
                      conversion = c(10,20,20,10,40))
    
    df2 <- df1
    
    df3 <- df1
    

    那么最好将这些数据框放在一个列表中。像这样:

    df_ls <- list(df1, df2, df3)
    

    然后你可以这样做以获得你想要的输出。

    library(dplyr)
    library(purrr)
    df_ls %>% map(~ mutate(., weight = conversion/sum(conversion)))
    

    如果列表中没有数据框,只需创建一个包含数据框名称的字符向量。像这样:

    df_ls1 <- c("df1", "df2", "df3")
    

    那么你可以这样做:

    df_ls1 %>% map(~ mutate(get(., envir = .GlobalEnv), weight = conversion/sum(conversion)))
    

    两种方式产生相同的输出 - 数据框列表:

    [[1]]
            Date     ID Value conversion weight
    1 2018-07-16 123450 617.0         10    0.1
    2 2018-07-23 123450 467.0         20    0.2
    3 2018-07-30 123450  44.6         20    0.2
    4 2018-08-06 123450 248.0         10    0.1
    5 2018-08-13 123450 177.0         40    0.4
    
    [[2]]
            Date     ID Value conversion weight
    1 2018-07-16 123450 617.0         10    0.1
    2 2018-07-23 123450 467.0         20    0.2
    3 2018-07-30 123450  44.6         20    0.2
    4 2018-08-06 123450 248.0         10    0.1
    5 2018-08-13 123450 177.0         40    0.4
    
    [[3]]
            Date     ID Value conversion weight
    1 2018-07-16 123450 617.0         10    0.1
    2 2018-07-23 123450 467.0         20    0.2
    3 2018-07-30 123450  44.6         20    0.2
    4 2018-08-06 123450 248.0         10    0.1
    5 2018-08-13 123450 177.0         40    0.4
    

    【讨论】:

      【解决方案2】:

      由于您是 R 新手,请考虑使用 base 包,该包随 R 的每次安装和每个 R 会话加载。其实library是一个base的方法!

      使用这个包,您可以运行简单的算术并使用transformwithin 处理新的列分配。

      df_list <- list(df_1, df_2, df_3)
      
      new_df_list <- lapply(df_list, function(df) 
          within(df, conv_weight <- conversion / sum(conversion))
          # transform(df, conv_weight = conversion / sum(conversion))  # EQUIVALENT CALL
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 2019-04-21
        • 1970-01-01
        • 2014-09-16
        相关资源
        最近更新 更多