С R-кадра данных: подсчитать значения не-NA по столбцам, сгруппированные по одному из столбцов - PullRequest
0 голосов
/ 05 июля 2018

Я гарантирую, что есть более простой способ достичь моей цели. Мне нужно посчитать не-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))))}

вводить имена групп в список и преобразовывать их в фрейм данных

names(count_non_NA) <- distinct_groups$grouping
count_non_NA <- as.data.frame(count_non_NA)
count_non_NA

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Мы можем использовать summarise_all

library(dplyr)
litmus %>% 
   group_by(grouping) %>% 
   summarise_all(funs(sum(!is.na(.))))
0 голосов
/ 05 июля 2018

можно просто sum(!is.na(column name)) для каждого вектора ...

Для фрейма данных с использованием dplyr:

df%>%group_by(grouping_variable)%>%summarise("nonNAcol1"= sum(!is.na(col1name),

..... и т. Д. Для других столбцов)

Могут быть более общие решения, использующие функции применения для столбцов или столбцов seq_along для неизвестного числа. Проверьте SO, чтобы узнать больше и руководства по dplyr. R4ds глава 5 .. http://r4ds.had.co.nz/transform.html

Приветствие.

0 голосов
/ 05 июля 2018

Я добавил несколько дополнительных наблюдений, чтобы вы могли увидеть, как работает группировка. В приведенном вами примере есть только 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...