按组计算非NA值的数量

5

For example, I have this data frame (df):

Color    X1      X2    X3    X4
Red      1       1     0     2
Blue     0       NA    4     1 
Red      3       4     3     1
Green    2       2     1     0

我想创建一个函数,按组(即按“颜色”)计算“X2”中非NA的数量。我希望将此函数的输出放在名为newdf的新数据框中。以下是我想要的输出:
Color    X2     
Red      2      
Blue     NA    
Green    1

到目前为止,我有这段代码:
Question <- function(Color){
  Result <-
    rowsum((df[c("X2")] > 0) + 0, df[["X2"]], na.rm = TRUE) 
  rowSums(Result)[[Color]]
  }
  Question("Red") 

该函数的输出结果只是 Question("Red")= 2,我希望能够得到所有颜色的结果并存储在数据框(newdf)中。有谁能帮忙实现吗?谢谢!

1
你还可以使用命名向量:tapply(ifelse(is.na(df$X2), NA, 1), df$Color, FUN=sum) - jogo
1
使用 rowsum: rowsum(as.numeric(!is.na(dt$X2)), dt$Color) - user20650
3个回答

7
library(dplyr)
df1 <-  df %>%
           group_by(Color) %>%
           summarise(sum(!is.na(X2)))
df1
#  (chr)           (int)
#1   Red               2
#2  Blue               0
#3 Green               1

如果你真的想要 NA 而不是 0,那么

df1[df1 ==0]<-NA

5

如果您想使用data.table:

library(data.table)

dt[,sum(!is.na(X2)),by=.(Color)]

  Color V1
1:   Red  2
2:  Blue  0
3: Green  1

同样在数据表中使用 ifelse() 函数可以轻松替换0为NA,示例如下:

dt[,ifelse(sum(!is.na(X2)==0),as.integer(NA),sum(!is.na(X2))),by=.(Color)]

   Color V1
1:   Red  2
2:  Blue NA
3: Green  1

资料:

 dt <- as.data.table(fread("Color    X1      X2    X3    X4
Red      1       1     0     2
Blue     0       NA    4     1 
Red      3       4     3     1
Green    2       2     1     0"))

0

使用基本的R语言,我们可以使用aggregate函数,并将na.action参数设置为na.pass,以允许处理NA值。

aggregate(X2~Color, df, function(x) sum(!is.na(x)), na.action = na.pass)

#  Color X2
#1  Blue  0
#2 Green  1
#3   Red  2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接