我保证有更简单的方法来完成我的目标。我需要计算数据帧的非NA值,按所述数据帧中的一列分组。*这是我关于堆叠溢出的第一个问题,请耐心点。
以下是我的当前代码:
测试数据:
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))))}将组名输入列表并转换为dataframe
names(count_non_NA) <- distinct_groups$grouping
count_non_NA <- as.data.frame(count_non_NA)
count_non_NA发布于 2018-07-05 15:28:04
我们可以使用summarise_all
library(dplyr)
litmus %>%
group_by(grouping) %>%
summarise_all(funs(sum(!is.na(.))))发布于 2018-07-05 15:27:16
我添加了一些额外的观察,这样您就可以看到分组是如何工作的,假设每个组只有一个观察。
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发布于 2018-07-05 15:36:47
可以是每个向量的sum(!is.na(column name)) .
对于使用dplyr的数据帧:
df%>%group_by(grouping_variable)%>%summarise("nonNAcol1"= sum(!is.na(col1name),( .....so on.for其他列)
对于数目未知的列或seq_along列,可以使用更多的通用解决方案。检查以便获得更多和dplyr教程。R4ds第5章.http://r4ds.had.co.nz/transform.html
干杯。
https://stackoverflow.com/questions/51194922
复制相似问题