R:mutate()在select()之后使用chaining进行应用

时间:2014-11-26 13:58:07

标签: r apply dplyr chaining

require('dplyr')
set.seed(8)
df <- data.frame(v1=rnorm(5),
                 v2=rnorm(5),
                 v3=rnorm(5))

如果我要计算上面的值的数量,比如0,并把它放在一个新列中,我会这样做:

mutate(df, n=apply(df,1,function(x)sum(x>0)))

这会给:

       v1         v2          v3 n
1 -0.08458607 -0.1078814 -0.75979380 0
2  0.84040013 -0.1702891  0.29204986 2
3 -0.46348277 -1.0883317  0.42139859 1
4 -0.55083500 -3.0110517 -1.29448908 0
5  0.73604043 -0.5931743  0.06928509 2

现在我想使用dplyr进行链接,并对列的子集v1v2进行相同的操作,但无法弄清楚如何应用正确的数据。如果我这样做(在再次提出df之后):

df %>%
   select(v1, v2) %>%
   mutate(n=apply(df,1,function(x)sum(x>0)))

...与上面相同(相同n,即它在所有三列中都有计数),同时使用.传递数据或只是空白:不起作用。

df %>%
   select(v1, v2) %>%
   mutate(n=apply(.,1,function(x)sum(x>0)))

或:

df %>%
   select(v1, v2) %>%
   mutate(n=apply(1,function(x)sum(x>0)))

怎么了?

1 个答案:

答案 0 :(得分:5)

在我们使用select对所需列进行子集化后,应用rowwise()函数,然后使用do。这里.指的是我们在select步骤之后获得的数据框。当我们执行sum(.>0)时,它将在新数据集的每一行上应用该函数。最后,我们data.frame(., n=..)获取所有以前的列以及新创建的n

df %>% 
   select(v1, v2) %>% 
   rowwise() %>% 
   do(data.frame(., n=sum(.>0)))
#           v1         v2 n
#1 -0.08458607 -0.1078814 0
#2  0.84040013 -0.1702891 1
#3 -0.46348277 -1.0883317 0
#4 -0.55083500 -3.0110517 0
#5  0.73604043 -0.5931743 1