计算列中的非NA数字并输出数据帧

时间:2017-01-25 13:52:28

标签: r multiple-columns counting

例如,我有这个数据框(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)中获取所有颜色的结果。有人能帮忙吗?谢谢!

3 个答案:

答案 0 :(得分:4)

或者如果你想使用data.table:

library(data.table)

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

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

同样很容易在data.table中使用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"))

答案 1 :(得分:3)

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

答案 2 :(得分: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