按组计算非 NA 值的数量
Count number of non-NA values by group
例如,我有这个数据框(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) 中获取所有颜色的结果。有人能帮忙吗?谢谢!
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
或者如果您想使用 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()
也很容易得到蓝色的 NA 而不是 0。参见:
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"))
对于基数 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
例如,我有这个数据框(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) 中获取所有颜色的结果。有人能帮忙吗?谢谢!
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
或者如果您想使用 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()
也很容易得到蓝色的 NA 而不是 0。参见:
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"))
对于基数 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