从R数据框中:按列对非NA值进行计数,并按其中一列分组

时间:2018-07-05 15:19:56

标签: r dataframe

我保证有一种更简单的方法可以实现我的目标。我需要计算数据帧的非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

3 个答案:

答案 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

干杯。