gpt4 book ai didi

R分组,计算非NA值

转载 作者:行者123 更新时间:2023-12-04 23:39:54 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com