使用此列中的数据时排除“dplyr”“mutate_at”中的列

2023-12-03

我想重新调整所有变量(但是year and gender) in a df由一个具体的year,分组依据gender:

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]))

ifelse(year == 3, 0, var_a - var_a[year == 3]) 中的错误:对象 未找到“年份”

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

这与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]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用此列中的数据时排除“dplyr”“mutate_at”中的列 的相关文章

随机推荐