gpt4 book ai didi

r - 使用此列中的数据时排除 `dplyr` `mutate_at` 中的列

转载 作者:行者123 更新时间:2023-12-02 11:57:06 28 4
gpt4 key购买 nike

我想将 df 中的所有变量(除 yeargender)重新调整一个特定的year ,按性别分组:

set.seed(1)
df <- data.frame(gender = c(rep("m", 5), rep("f", 5)), year = rep(1:5, 2), var_a = 1:10, var_b = 0:9)
df

gender year var_a var_b
1 m 1 1 0
2 m 2 2 1
3 m 3 3 2
4 m 4 4 3
5 m 5 5 4
6 f 1 6 5
7 f 2 7 6
8 f 3 8 7
9 f 4 9 8
10 f 5 10 9

我可以使用以下方式生成我期望的内容:

df %>% group_by(gender) %>% mutate(var_a = ifelse(year == 3, 0, var_a - var_a[year == 3])) %>%
mutate(var_b = ifelse(year == 3, 0, var_b - var_b[year == 3]))

gender year var_a var_b
<fct> <int> <dbl> <dbl>
1 m 1 -2 -2
2 m 2 -1 -1
3 m 3 0 0
4 m 4 1 1
5 m 5 2 2
6 f 1 -2 -2
7 f 2 -1 -1
8 f 3 0 0
9 f 4 1 1
10 f 5 2 2

但是,这不是一个选项,因为我有太多列。

所以我尝试了(没有成功):

df %>% group_by(gender) %>% mutate_at(vars(-gender, -year), ifelse(year == 3, 0, var_a - var_a[year == 3]))

Error in ifelse(year == 3, 0, var_a - var_a[year == 3]) : object 'year' not found

如何使用 vars(-col_name) 排除 mutate_at(或替代方案)中的列名称,同时仍读取这些列中的数据?

这与 this one 相关

最佳答案

使用mutate_at中的位置

library(dplyr)

df %>%
group_by(gender) %>%
mutate_at(-c(1, 2), ~ifelse(year == 3, 0, . - .[year == 3]))

# gender year var_a var_b
# <fct> <int> <dbl> <dbl>
# 1 m 1 -2 -2
# 2 m 2 -1 -1
# 3 m 3 0 0
# 4 m 4 1 1
# 5 m 5 2 2
# 6 f 1 -2 -2
# 7 f 2 -1 -1
# 8 f 3 0 0
# 9 f 4 1 1
#10 f 5 2 2

如果您事先不知道列的位置,可以先找到它

cols <- which(names(df) %in% c("gender", "year"))

df %>%
group_by(gender) %>%
mutate_at(-cols, ~ifelse(year == 3, 0, . - .[year == 3]))
<小时/>

或者选择starts_with的列

df %>%
group_by(gender) %>%
mutate_at(vars(starts_with("var")), ~ifelse(year == 3, 0, . - .[year == 3]))

关于r - 使用此列中的数据时排除 `dplyr` `mutate_at` 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55902751/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com