R 在列的子集上使用“按行变异”

R 在列的子集上使用“按行变异”,r,dplyr,R,Dplyr,我正在尝试创建一个新列,该列将包含对tibble的一个子集按行进行的计算结果,并将此新列添加到现有tibble中。像这样: df <- tibble( ID = c("one", "two", "three"), A1 = c(1, 1, 1), A2 = c(2, 2, 2), A3 = c(3, 3, 3) ) …因为我去掉了“ID”列,以便让mutate在其他(数字)列上运行行和。我曾尝试在变异后在管道中查找或绑定,但不起作用。mutate的所有变体都不起作用,因为它们在适当的位置

我正在尝试创建一个新列,该列将包含对tibble的一个子集按行进行的计算结果,并将此新列添加到现有tibble中。像这样:

df <- tibble(
ID = c("one", "two", "three"),
A1 = c(1, 1, 1),
A2 = c(2, 2, 2),
A3 = c(3, 3, 3)
)
…因为我去掉了“ID”列,以便让mutate在其他(数字)列上运行行和。我曾尝试在变异后在管道中查找或绑定,但不起作用。mutate的所有变体都不起作用,因为它们在适当的位置工作(在tible的每个单元格内,而不是跨列工作,即使使用rowwise)

这确实有效,但我觉得这不是一个优雅的解决方案:

df %>% 
mutate(SumA = rowSums(.[,grepl("^A", colnames(df))]))
是否有任何基于tidyverse的解决方案不需要grepl或方括号,只需要更标准的dplyr动词和参数

我的预期输出是:

df_out <- tibble(
ID = c("one", "two", "three"),
A1 = c(1, 1, 1),
A2 = c(2, 2, 2),
A3 = c(3, 3, 3),
SumA = c(6, 6, 6)
)

df_out这里有一种方法可以使用
purr::pmap
tidyverse
中进行行计算。这最适合用于实际需要逐行运行的函数;简单的加法可能是一种更快的方法。基本上,我们使用
select
pmap
提供输入列表,这样我们就可以使用
select
帮助程序,如
start\u with
matches
(如果需要正则表达式)

库(tidyverse)
df%
变异(
SumA=pmap_dbl(
.l=选择(,以“A”开头),
.f=函数(…)和(…)
)
)
#>#tibble:3 x 5
#>ID A1 A2 A3 SumA
#>       
#>1 1 2 3 6
#>二二一二三六
#>三三一二三六

由(v0.2.1)创建于2019-01-30这里有一种不同的方法,它不按行移动,而是利用加法的矢量化性质,加法可以实现通勤。它允许使用重复应用
+
purrr::reduce

库(tidyverse)
df%
变异(
SumA=减少(
.x=选择(,以“A”开头),
.f=`+`
)
)
#>#tibble:3 x 5
#>ID A1 A2 A3 SumA
#>       
#>1 1 2 3 6
#>二二一二三六
#>三三一二三六
由(v0.2.1)

1)于2019-01-30创建,要使用
行和
尝试在
mutate
中嵌套第二条管道,如下所示:

library(dplyr)

df %>% mutate(Sum = select(., starts_with("A")) %>% rowSums)
给予:

# A tibble: 3 x 5
  ID       A1    A2    A3   Sum
  <chr> <dbl> <dbl> <dbl> <dbl>
1 one       1     2     3     6
2 two       1     2     3     6
3 three     1     2     3     6
# A tibble: 3 x 5
  ID       A1    A2    A3   Sum
  <chr> <dbl> <dbl> <dbl> <dbl>
1 one       1     2     3     6
2 two       1     2     3     6
3 three     1     2     3     6
给予:

# A tibble: 3 x 5
  ID       A1    A2    A3   Sum
  <chr> <dbl> <dbl> <dbl> <dbl>
1 one       1     2     3     6
2 two       1     2     3     6
3 three     1     2     3     6
# A tibble: 3 x 5
  ID       A1    A2    A3   Sum
  <chr> <dbl> <dbl> <dbl> <dbl>
1 one       1     2     3     6
2 two       1     2     3     6
3 three     1     2     3     6
#一个tible:3 x 5
ID A1 A2 A3和
1 1 2 3 6
二二一二三六
三三一二三六

[upd]我没有注意到@Calum使用了几乎相同的方法

另一种可能的方法是:

library(dplyr)
library(purrr)

dat %>%
  mutate(SumA = pmap_dbl(select(., contains('A')), sum))   
数据:


#dat您可以嵌套并在嵌套列上使用
行和

library(tidyverse)
df %>% nest(-ID) %>%
  mutate(SumA = map_dbl(data,rowSums)) %>%
  unnest

# # A tibble: 3 x 5
#      ID  SumA    A1    A2    A3
#   <chr> <dbl> <dbl> <dbl> <dbl>
# 1   one     6     1     2     3
# 2   two     6     1     2     3
# 3 three     6     1     2     3
为了证明基础有时更容易:

df$SumA <- rowSums(df[-1])

df$SumA哇,谢谢大家,这里有很多好主意-很难选择首选答案。我喜欢Callum You的pmap(尽管reduce仍然让我困惑:-),我喜欢G.Grothendieck的嵌套管道(我不知道你能做到),utubun的Callum You的简化版本解决方案。
# # A tibble: 3 x 5
#   ID       A1    A2    A3  SumA
#   <chr> <dbl> <dbl> <dbl> <dbl>
# 1 one       1     2     3     6
# 2 two       1     2     3     6
# 3 three     1     2     3     6
library(tidyverse)
df %>% nest(-ID) %>%
  mutate(SumA = map_dbl(data,rowSums)) %>%
  unnest

# # A tibble: 3 x 5
#      ID  SumA    A1    A2    A3
#   <chr> <dbl> <dbl> <dbl> <dbl>
# 1   one     6     1     2     3
# 2   two     6     1     2     3
# 3 three     6     1     2     3
df %>% mutate(SumA = pmap_dbl(.[-1],sum))
# # A tibble: 3 x 5
#      ID    A1    A2    A3  SumA
#   <chr> <dbl> <dbl> <dbl> <dbl>
# 1   one     1     2     3     6
# 2   two     1     2     3     6
# 3 three     1     2     3     6
df$SumA <- rowSums(df[-1])