假设我有一个tibble
,我需要将多个变量转换为新的多个新变量。
作为一个例子,这是一个简单的tibble:
tb <- tribble(
~x, ~y1, ~y2, ~y3, ~z,
1,2,4,6,2,
2,1,2,3,3,
3,6,4,2,1
)
我想从名称以&#34; y&#34;开头的每个变量中减去变量z,并将结果变为tb的新变量。另外,假设我不知道有多少&#34; y&#34;我有变数。我希望该解决方案能够很好地适应tidyverse
/ dplyr
工作流程。
实质上,我不了解如何将多个变量变为多个新变量。我不确定你是否可以在这个例子中使用mutate
?我已经尝试了mutate_if
,但我认为我没有正确使用它(我收到错误):
tb %>% mutate_if(starts_with("y"), funs(.-z))
#Error: No tidyselect variables were registered
提前致谢!
答案 0 :(得分:11)
由于您使用的是列名,因此需要使用mutate_at
而不是使用列中值的mutate_if
tb %>% mutate_at(vars(starts_with("y")), funs(. - z))
#> # A tibble: 3 x 5
#> x y1 y2 y3 z
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 0 2 4 2
#> 2 2 -2 -1 0 3
#> 3 3 5 3 1 1
要创建新列,而不是覆盖现有列,我们可以为funs
# add suffix
tb %>% mutate_at(vars(starts_with("y")), funs(mod = . - z))
#> # A tibble: 3 x 8
#> x y1 y2 y3 z y1_mod y2_mod y3_mod
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 2 4 6 2 0 2 4
#> 2 2 1 2 3 3 -2 -1 0
#> 3 3 6 4 2 1 5 3 1
# remove suffix, add prefix
tb %>%
mutate_at(vars(starts_with("y")), funs(mod = . - z)) %>%
rename_at(vars(ends_with("_mod")), funs(paste("mod", gsub("_mod", "", .), sep = "_")))
#> # A tibble: 3 x 8
#> x y1 y2 y3 z mod_y1 mod_y2 mod_y3
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 2 4 6 2 0 2 4
#> 2 2 1 2 3 3 -2 -1 0
#> 3 3 6 4 2 1 5 3 1
修改:在dplyr 0.8.0
或更高版本中,funs()
将被弃用(source1&amp; source2),需要使用{{ 1}}而不是
list()
由reprex package创建于2018-10-29(v0.2.1)