R 在列的子集上使用“按行变异”
我正在尝试创建一个新列,该列将包含对tibble的一个子集按行进行的计算结果,并将此新列添加到现有tibble中。像这样: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的所有变体都不起作用,因为它们在适当的位置
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])