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

use*_*672 2 r apply chaining dplyr

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

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

mutate(df, n=apply(df,1,function(x)sum(x>0)))
Run Code Online (Sandbox Code Playgroud)

这会给:

       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
Run Code Online (Sandbox Code Playgroud)

现在我想使用dplyr与链接,并在列的子集同样的事情,v1 而且v2,但无法弄清楚如何让应用正确的数据.如果我只是做(在df再次制造原因之后):

df %>%
   select(v1, v2) %>%
   mutate(n=apply(df,1,function(x)sum(x>0)))
Run Code Online (Sandbox Code Playgroud)

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

df %>%
   select(v1, v2) %>%
   mutate(n=apply(.,1,function(x)sum(x>0)))
Run Code Online (Sandbox Code Playgroud)

要么:

df %>%
   select(v1, v2) %>%
   mutate(n=apply(1,function(x)sum(x>0)))
Run Code Online (Sandbox Code Playgroud)

怎么了?

akr*_*run 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
Run Code Online (Sandbox Code Playgroud)