如何查找R中每组内 Dataframe 各列的零比例

xvw2m8pv  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(113)

我有一个包含一个“range”列和多个“var”列的数据框(如下所示)。我需要找出每个“range”组中每个“var”列中零的比例。最终目标是为每个var列创建一个图表,显示零的比例随范围的增加而增加。然而,我只是在试图找出零的比例时遇到了麻烦。
以下是一个示例数据集(注意包含NA值):

id <- seq(16)
      range <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4)
      var1 <- c(40,1.2,0,0, 1.5,1.6,NA,NA,6,0,9,3,4,0,0,0)
      var2 <- c(20,6,7,11, 0,0,0,0,NA,2,3,3,6,9,9,0)
      var3 <- c(4,6,0,11, 9,8,7,0,NA,NA,NA,NA,0,0,9,8)
      var4 <- c(NA,0,0,NA, 4,6,7,0,0,0,0,0,0,0,9,8)
      df <- data.frame(id, range, var1, var2, var3, var4)

我试着创建一个循环来计算每列中零的比例,在dplyr中使用group_by()函数,然后使用mutate()添加一个列来表示该比例,但是我不知道如何使用索引值来表示mutate中的第i列:

for(i in 3:length(ncol(df))){
    df_new<-df[ , c(1:2,i)]%>%
    group_by(range)%>%
    mutate(prop_zero = sum(names(df[,i])==0, na.rm = TRUE)/sum(names(df[,i]))
    }

我知道这样做有很多问题,但我不知道如何进行。提前感谢你。

zzlelutf

zzlelutf1#

我们可以使用across来循环'var'列,通过计算reframe中按'range'分组的逻辑表达式(.x == 0)的mean来获得比例

library(dplyr) # version >= 1.1.0
df %>% 
   reframe(across(starts_with("var"),
   ~ if(! 0 %in% .x) 0 else mean(.x== 0, na.rm = TRUE)), .by = "range")
  • 输出
range var1 var2 var3 var4
1     1 0.50 0.00 0.25 1.00
2     2 0.00 1.00 0.25 0.25
3     3 0.25 0.00 0.00 1.00
4     4 0.75 0.25 0.50 0.50

相关问题