【问题标题】:Using loops with mutate in R to sum columns with partially matching column names在 R 中使用带有 mutate 的循环对列名部分匹配的列求和
【发布时间】:2020-09-13 09:40:57
【问题描述】:
df <- data.frame(x_1_jr=c(1,2,3,4), x_2_jr=c(1,2,3,4), y_1_jr=c(4,3,2,1), y_2_jr=c(4,3,2,1)

  x_1_jr x_2_jr y_1_jr y_2_jr
1      1      1      4      4
2      2      2      3      3
3      3      3      2      2
4      4      4      1      1

我正在尝试生成具有相同列名后缀的 x 和 y 之和的新变量,即

df <- df %>% mutate(z_1_jr= x_1_jr + y_1_jr)

  x_1_jr x_2_jr y_1_jr y_2_jr z_1_jr
1      1      1      4      4      5
2      2      2      3      3      5
3      3      3      2      2      5
4      4      4      1      1      5

我可以为每个变量组合写出这个,但我有大量变量(每个 x 和 y 组>50),并且想使用循环......但是,我对R,不知道从哪里开始!

有人可以帮忙吗?谢谢!

编辑:为了更清楚起见,数据集包含其他非数字变量。有 >700 列(来自大型调查)。例如,x_1_jr 表示 1 岁的男性个体的数量,y_1_jr 1 岁的女性个体的数量。我试图为每个年龄组计算一个总数(男性加女性 1 年)。

一个

【问题讨论】:

    标签: r loops dplyr names


    【解决方案1】:

    dplyrpurrr 选项可以是:

    df %>%
     bind_cols(map_dfc(.x = unique(sub(".*?_", "_", names(df))),
                       ~ df %>%
                        transmute(!!paste0("z", .x) := rowSums(select(., ends_with(.x))))))
    
      x_1_jr x_2_jr y_1_jr y_2_jr z_1_jr z_2_jr
    1      1      1      4      4      5      5
    2      2      2      3      3      5      5
    3      3      3      2      2      5      5
    4      4      4      1      1      5      5
    

    【讨论】:

    • 啊,没关系,您上次的编辑解决了这个问题!谢谢你:)
    【解决方案2】:

    base R 的选项

    df[c("z_1_jr", "z_2_jr")] <- sapply(split.default(df, 
          sub("^[a-z]+_", "", names(df))), rowSums)
    df
    #  x_1_jr x_2_jr y_1_jr y_2_jr z_1_jr z_2_jr
    #1      1      1      4      4      5      5
    #2      2      2      3      3      5      5
    #3      3      3      2      2      5      5
    #4      4      4      1      1      5      5
    

    【讨论】:

    • 我需要指定所有的新列名吗?我有 100 多个新的要生成。
    • @tabbicat 你可以用paste 创建一个向量,即paste0('z_', 1:2, '_jr')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多