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

标签 r dplyr

我想将 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/

相关文章:

R:大向量的高效迭代子集和过滤

r - dplyr:具有部分字符串匹配的inner_join

r - 使用 dplyr::tbl 引用 PostgreSQL(振幅分析)表失败

r - 在数据框中分隔一列,其中每个观察值都可以有多个并发值

r - 基准和处理时间结果的差异

regex - 在列表元素的子集上使用 lapply 并返回与 R 中原始长度相同的列表

rvest 函数 html_nodes 返回 {xml_nodeset (0)}

R:找到所有值的 95% 范围的函数?

r - 使用 tabplot 包时此错误 "Error in if (any(B < 1)) stop("B 太小")"的含义是什么

r - 函数 : use reorder in aes function 中的 dplyr 和 ggplot