mutate和rowSums排除列

时间:2015-10-24 05:51:10

标签: r dplyr

类似于:mutate rowSums exclude one column但在我的情况下,我真的希望能够使用select删除特定的列或列集

我试图理解为什么这种性质的东西不会起作用。

d <- data.frame(
   Alpha = letters[1:26], 
   Beta = rnorm(26),
   Epsilon = rnorm(26),
   Gamma = rnorm(26)
)

我认为这会奏效,但它给了我一个奇怪的错误:

# Total = Beta + Gamma
d <- mutate(d,Total = rowSums(select(d,-Epsilon,-Alpha)))

Error: All select() inputs must resolve to integer column positions.
The following do not:
*  -structure(1:26, .Label = c("a", "b", "c", "d", "e", "f", "g", "h", "i...
In addition: Warning message:
In Ops.factor(1:26) : ‘-’ not meaningful for factors

我希望能够在一个长链中做到这一点,并保持它&#34; dplyr风格&#34; ...这让我觉得很奇怪,因为它是如此困难#39 ; s非常简单,不使用典型的dplyr语法:

d$Total <- rowSums(select(d, -Alpha, -Epsilon)) # This works! 

2 个答案:

答案 0 :(得分:4)

@akrun 提供了关于此问题的relevant link。关于dplyr解决方案,我实际上会使用do

d %>%
  do({
    .$Total <- rowSums(select(., -Epsilon, -Alpha))
    .
  })

答案 1 :(得分:1)

我只是在学习dplyr,所以也许是因为版本升级,但是现在可以了:

d %>% mutate(Total=rowSums(select(d,-Epsilon, -Alpha)))

这些天,我通常会看到人们使用点符号:

d %>% mutate(Total=rowSums(select(.,-Epsilon, -Alpha)))

一个更易于管理的示例:

df2 = data.frame(A=sample(0:20,10), B=sample(0:20, 10), C=sample(0:20,10), D=LETTERS[1:10])
df2
    A  B  C D
1  19  0  9 A
2   6 10 14 B
3  13 20  6 C
4  20  4 15 D
5   9 14  8 E
6  11  1 18 F
7   4 15 13 G
8  17  5  0 H
9  16  3 16 I
10  2  6  1 J
df2 %>% mutate(total=rowSums(select(.,-D)))
    A  B  C D total
1  19  0  9 A    28
2   6 10 14 B    30
3  13 20  6 C    39
4  20  4 15 D    39
5   9 14  8 E    31
6  11  1 18 F    30
7   4 15 13 G    32
8  17  5  0 H    22
9  16  3 16 I    35
10  2  6  1 J     9

注意:
您链接到的问题有一个updated answer,它显示了另一个新方法,该新方法演示了dplyr的一些新功能:

df2 %>% mutate(total=rowSums(select_if(., is.numeric)))
    A  B  C D total
1  19  0  9 A    28
2   6 10 14 B    30
3  13 20  6 C    39
4  20  4 15 D    39
5   9 14  8 E    31
6  11  1 18 F    30
7   4 15 13 G    32
8  17  5  0 H    22
9  16  3 16 I    35
10  2  6  1 J     9