R GROUP BY,计算非NA值 [英] R group by, counting non-NA values

查看:5
本文介绍了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选项,bycolSums按逻辑矩阵(!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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆