我不想在mutate调用中显式说明列名,而是想从其他地方生成的名称列表中动态地这样做。我尝试了以下思路:
df <- data.frame(x=1:10, y=21:30)
l <- c('x', 'y')
get_from_df <- function(x) { get(pos=df,x) }
df %>% rowwise %>% mutate(presum=do.call(sum, map(l, get_from_df)))
它给出了整个data. frame 310的总和,而不是行总和。输出是:
df %>% rowwise %>% mutate(presum=do.call(sum, map(l, get_from_df)))
# A tibble: 10 x 3
# Rowwise:
x y presum
<int> <int> <int>
1 1 21 310
2 2 22 310
3 3 23 310
4 4 24 310
5 5 25 310
6 6 26 310
7 7 27 310
8 8 28 310
9 9 29 310
10 10 30 310
我最终没有使用rowSum代替按行返回。
df %>% mutate(presum=rowSums(do.call(cbind, map(l,f)) ))
它可以工作,但我想更好地了解rowwise在幕后做了什么以及我遇到了什么限制。在我抽出时间阅读一些代码之前,有没有什么地方可以描述这一点?
也许这就是你要找的?
注意使用c_across
和all_of
从整齐的选择。
library(tidyverse)
df <- data.frame(x=1:10, y=21:30)
l <- c('x', 'y')
get_from_df <- function(x) { get(pos=df,x) }
#df %>% rowwise %>% mutate(presum=do.call(sum, map(l, get_from_df)))
df %>%
rowwise() %>%
mutate(presum = sum(c_across(all_of(l))))
#> # A tibble: 10 × 3
#> # Rowwise:
#> x y presum
#> <int> <int> <int>
#> 1 1 21 22
#> 2 2 22 24
#> 3 3 23 26
#> 4 4 24 28
#> 5 5 25 30
#> 6 6 26 32
#> 7 7 27 34
#> 8 8 28 36
#> 9 9 29 38
#> 10 10 30 40
由reprex包(v2.0.1)于2021-11-24创建