总结if条件下的逻辑语句

Summarise logical statement in if condition

我有一个数据框,其中包含一个名为 '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

您可以使用 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))