在 R 中使用带有 mutate 的循环对具有部分匹配列名的列求和
Using loops with mutate in R to sum columns with partially matching column names
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_jr1岁女性个体的数量。我正在尝试获得每个年龄组的总数(男性加上 1 岁的女性)。
一个
一个dplyr
和purrr
选项可以是:
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
选项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
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_jr1岁女性个体的数量。我正在尝试获得每个年龄组的总数(男性加上 1 岁的女性)。
一个
一个dplyr
和purrr
选项可以是:
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
选项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