【问题标题】:Error is using absolute difference in dplyr package?错误是在 dplyr 包中使用绝对差异?
【发布时间】:2020-08-01 07:28:23
【问题描述】:

我有一个看起来像这样的数据框。

df <- data.frame(Year = c(2016,2017,2016,2017),
                 Month = c(1,2,1,2),
                 valueA = c(40,29,25,22),
                 valueB = c(40,36,31,30))

我希望通过按年和月对列进行分组来计算差异。

abs(aggregate(.~ Year + Month, df, diff))
#  Year Month valueA valueB
#1 2016     1     15      9
#2 2017     2      7      6

如果我在 dplyr 包中尝试同样的事情,它不起作用。

 library(dplyr)
    df %>% group_by(Year, Month) %>% summarise_all(abs(diff))
    #Error in abs(diff) : non-numeric argument to mathematical function

另一方面,如果我删除 abs 函数,它可以工作。

df %>% group_by(Year, Month) %>% summarise_all((diff))
 

    #Year Month valueA valueB
     # <dbl> <dbl>  <dbl>  <dbl>
    #1  2016     1    -15     -9
    #2  2017     2     -7     -6

知道为什么会出现错误以及如何从dplyr 包中获得所需的输出吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    如果你想应用一个函数,你可以简单地传递函数名称summarise。但是,如果要应用复合函数,则必须更加明确。试试这个:

    df <- data.frame(Year = c(2016,2017,2016,2017),
                     Month = c(1,2,1,2),
                     valueA = c(40,29,25,22),
                     valueB = c(40,36,31,30))
    
    library(dplyr)
    df %>% group_by(Year, Month) %>% summarise_all(~ abs(diff(.x)))
    #> # A tibble: 2 x 4
    #> # Groups:   Year [2]
    #>    Year Month valueA valueB
    #>   <dbl> <dbl>  <dbl>  <dbl>
    #> 1  2016     1     15      9
    #> 2  2017     2      7      6
    

    【讨论】:

    • ~(.x)summarise_all 公式中的作用是什么?
    • @Silent_bliss 为方便起见,dplyr 允许使用公式表示法编写(匿名)函数,即 ~ abs(diff(.x))function(x) abs(diff(x)) 相同。所以在某种意义上~ 意味着function。但是,当使用公式表示法时,我们必须将参数命名为 .x.
    【解决方案2】:

    summarise_all之后可以尝试计算绝对值:

    df %>% 
      group_by(Year, Month) %>%
      summarise_all(diff) %>% 
      mutate_all(abs)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多