R:使用链接在 select() 之后使用 mutate() 和 apply

标签 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)))

怎么了?

最佳答案

使用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

关于R:使用链接在 select() 之后使用 mutate() 和 apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27151046/

相关文章:

R 如何使用 case_when() 确定列中的前一个值是否大于有序向量中的前一个值

r - 在现有行之间添加具有特定值的行

r - 非英文环境下的Data.table、逻辑比较和编码错误/错误

r - 带有成对列的 pivot_longer 中缺少前缀

python - 当数据库是第二个位置参数时,Pandas 应用函数

r - 制表多个响应问题

r - 合并数据帧,优先级高于另一个

跨两行两列保留满足条件的记录

r - 更改 xlim 会自动更改 geom_density 的 ylim

r - 对所有参数组合应用函数(输出为列表)