在R中使用循环与mutate对部分匹配列名的列进行求和。

问题描述 投票:0回答:1
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比较陌生,不知道从哪里开始!

谁能帮助我?

EDIT:为了更清楚地说明,数据集包含其他非数字变量。例如,x_1_jr代表1岁的男性个体数量,y_1_jr代表1岁的女性个体。我试图得到每个年龄组的总人数(男性加上1岁的女性)。

A

r loops mutate names
1个回答
0
投票

一个选项具有 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

0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.