【问题标题】:Summarise logical statement in if condition总结 if 条件中的逻辑语句
【发布时间】:2021-12-08 05:58:17
【问题描述】:

我有一个数据框,其中包含一个名为“col0”的列和几个(超过 100 个)其他列(col1、col2、col3...)。我试图用 dplyr 有条件地总结它们(col0 和 weighted.mean 的总和),但它不起作用,因为它总结了列中的所有值。

我假设 if 语句后有偏差。

代码:

dt <- data.frame(col0 = c(1,2,3), 
                 col1 = c(0.1,0.2,0.3), 
                 col2 = c(0.2,0.3,0.4), 
                 col3 = c(0.1,0.2,0.3), 
                 col4 = c(0.2,0.3,0.4))

dt %>%
  summarise(across(everything(), ~ if(any(names(.) !=  "col0"))
  weighted.mean(., col0, na.rm = TRUE) 
  else sum(., na.rm = TRUE)))

结果:

  col0 col1 col2 col3 col4
1    6  0.6  0.9  0.6  0.9

注意:Ronak Shah 建议的解决方案是正确的,但(无论出于何种原因)我必须在 weighted.mean 函数中明确定义 wt

【问题讨论】:

    标签: r dplyr summarize


    【解决方案1】:

    您可以使用cur_column() 来获取列名。

    library(dplyr)
    
    dt %>%
      summarise(across(everything(), ~ if(cur_column() != 'col0') 
                                        weighted.mean(., col0, na.rm = TRUE) 
                                        else sum(., na.rm = TRUE)))
    
    #  col0      col1      col2      col3      col4
    #1    6 0.2333333 0.3333333 0.2333333 0.3333333
    

    另一种方法是单独应用 col0 的函数。

    dt %>%
      summarise(across(-col0, weighted.mean, col0, na.rm = TRUE),
                col0 = sum(col0))
    

    【讨论】:

    • 它对我不起作用:“'x' 和 'w' 必须具有相同的长度”
    • 你使用的数据和你的例子一样吗?
    • 是的,是同一个数据框
    • 奇怪这对我有用,没有任何错误。你的packageVersion('dplyr') 是什么?我在 1.0.7 也许你需要更新包。
    • 是的,这很奇怪。包版本:‘1.0.4’
    猜你喜欢
    • 2021-10-24
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多