【问题标题】:R: mutate() with apply after select() using chainingR: mutate() 在 select() 之后使用链式应用
【发布时间】:2015-01-24 21:25:42
【问题描述】:
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

现在我想使用dplyrwith 链接并在列子集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)))

怎么了?

【问题讨论】:

    标签: r apply dplyr chaining


    【解决方案1】:

    在我们使用select 对需要的列进行子集化后,应用rowwise() 函数,然后使用do。这里. 指的是我们在select 步骤之后得到的数据帧。当我们执行sum(.&gt;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
    

    【讨论】:

    • 很好,它工作得很好。为什么我的不行(第一次尝试)?
    • @akrun 你能用简单的英文句子告诉我们你做了什么吗?
    • @user3375672 您的代码正在计算完整 df 的每一行,而不是 select 列。 apply(df, 1, function(x) sum(x &gt;0))
    • @akrun,是的,我想我至少想通了,但是 apply(1, function(x) sum(x >0)) 怎么不起作用 - 如果链接不通过之后剩下的选择()?
    • @user3375672 正如我所提到的,一种选择是使用do。此外,我认为使用applydplyr 没有任何好处,无论如何你都可以这样做。关于行名,如果以后需要,可以将其添加为列。
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多