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)
怎么了?
在我们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)