R分组,计算非NA值

标签 r

我有一个散布 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

目前我已经使用循环完成了这项工作,但它又慢又不整洁,我相信有更好的方法。

聚合似乎达到了一半,但它包括 NA 的计数。
aggregate(toy_df, list(toy_df$label), FUN=length)

任何想法表示赞赏...

最佳答案

我们可以使用 data.table .将 'data.frame' 转换为 'data.table' ( setDT(toy_df) ),按 'Label' 分组,循环遍历 Data.table 的子集 ( .SD ) 并得到 sum非 NA 值 ( !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按逻辑矩阵的第 4 列分组 ( !is.na(toy_df[-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分组,计算非NA值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41150212/

相关文章:

r - 解决一次更新多个包时出现的 "cannot remove prior installation of package"错误

r - 为数组和原子向量定义自定义打印方法

r - 使用一个列表项作为 R 中同一列表中另一个列表项的变量

R Packrat 无法加载私有(private)库

r - 如何按数据框或矩阵中的不同行进行子集化?

r - 选择单笔订单最高消费金额

r - 在 Ubuntu 服务器上将 .R 文件转换为实际的 Shiny 应用程序

r - Shinyalerts : How do I know whether user pressed OK or Cancel?

r - 如何通过 SSH 从 R 查询 SAS

linux - 将时间戳添加到 R CMD BATCH 输出文件名