R GROUP BY,计算非NA值 [英] R group by, counting non-NA values
本文介绍了R GROUP BY,计算非NA值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个数据帧,其NA的散布
toy_df
# Y X1 X2 Label
# 5 3 3 A
# 3 NA 2 B
# 3 NA NA C
# 2 NA 6 B
我要按标签字段对其进行分组,并计算每个标签的每个变量中有多少个非NA值。
desired output:
# Label Y X1 X2
# A 1 1 1
# B 2 0 2
# C 1 0 0
我目前已经使用循环完成了这项工作,但它很慢且不整洁,我相信有更好的方法。
Aggregate似乎达到了一半,但它将NA包括在计数中。
aggregate(toy_df, list(toy_df$label), FUN=length)
任何想法都值得赞赏...
推荐答案
我们可以使用data.table
。将‘data.Frame’转换为‘data.table’(setDT(toy_df)
),按‘Label’分组,遍历Data.table(.SD
)的子集,得到非NA值的sum
(!is.na(x)
)
library(data.table)
setDT(toy_df)[, lapply(.SD, function(x) sum(!is.na(x))), by = Label]
# Label Y X1 X2
#1: A 1 1 1
#2: B 2 0 2
#3: C 1 0 0
或dplyr
使用相同的方法
library(dplyr)
toy_df %>%
group_by(Label) %>%
summarise_each(funs(sum(!is.na(.))))
或base R
选项,by
和colSums
按逻辑矩阵(!is.na(toy_df[-4])
)第4列分组
by(!is.na(toy_df[-4]), toy_df[4], FUN = colSums)
或rowsum
,方法与by
类似,只是使用rowsum
函数。
rowsum(+(!is.na(toy_df[-4])), group=toy_df[,4])
# Y X1 X2
#A 1 1 1
#B 2 0 2
#C 1 0 0
这篇关于R GROUP BY,计算非NA值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文