我保证有一种更简单的方法可以实现我的目标。我需要计算数据帧的非NA值,该数据帧按所述数据帧中的一列分组。 *这是我关于stackoverflow的第一个问题,请耐心等待。
这是我当前的代码:
测试数据:
grouping <- c(1234,5678,2359)
column1 <- c('asdf',NA,NA)
column2 <- c(NA,'asdf','asdf')
column3 <- c('asdf',NA,'asdf')
litmus <- data.frame(grouping, column1, column2, column3)
获取不同的组列表:
distinct_groups <- as.data.frame(litmus %>% distinct(grouping))
length(distinct_groups$grouping)
执行循环以分组方式将非NA值计数并放入列表
count_non_NA = list()
for (i in 1:length(distinct_groups$grouping)){
count_non_NA[[i]]<-apply(litmus[grouping == as.numeric(distinct_groups$grouping[i]),], 2, function(x) length(which(!is.na(x))))}
将组名输入列表并转换为数据框
names(count_non_NA) <- distinct_groups$grouping
count_non_NA <- as.data.frame(count_non_NA)
count_non_NA
答案 0 :(得分:1)
我添加了一些额外的观察值,因此您可以看到分组的工作方式,就像您提供的示例一样,每个组只有1个观察值。
library(dplyr)
grouping <- c(1234,5678,2359, 1234,5678,2359)
column1 <- c('asdf',NA,NA, 'asdf',NA,NA)
column2 <- c(NA,'asdf','asdf', NA,'asdf','asdf')
column3 <- c('asdf',NA,'asdf', 'asdf',NA,'asdf')
litmus <- data.frame(grouping, column1, column2, column3)
litmus %>%
dplyr::group_by(grouping) %>%
dplyr::summarise_at(vars(column1:column3), ~ sum(!(is.na(.))))
# # A tibble: 3 x 4
# grouping column1 column2 column3
# <dbl> <int> <int> <int>
# 1234 2 0 2
# 2359 0 2 2
# 5678 0 2 0
答案 1 :(得分:1)
我们可以使用summarise_all
library(dplyr)
litmus %>%
group_by(grouping) %>%
summarise_all(funs(sum(!is.na(.))))
答案 2 :(得分:0)
可以很简单
sum(!is.na(column name))
每个向量...
对于使用dplyr的数据框:
df%>%group_by(grouping_variable)%>%summarise("nonNAcol1"= sum(!is.na(col1name),
... so ..其他栏目
对于未知数,可以在列或seq_along列上应用apply函数,从而获得更多通用解决方案。在SO上查看更多和dplyr教程。 R4ds第5章。http://r4ds.had.co.nz/transform.html
干杯。