Подсчет повторяющихся строк и первого появления не-NA во фрейме данных - PullRequest
0 голосов
/ 22 января 2020

У меня есть следующий пример набора данных:

library(tidyverse)
dataset <- data.frame(id = c("A","A","B","B","C","A","C","B"), 
                  value = c(100, 500, 200, 100, 500, 300, 400, 100), 
                  status = c(NA, "Valid", NA, NA, "Pend", NA, NA, NA), 
                  stringsAsFactors = FALSE)

Мне нужно извлечь эти уникальные идентификаторы с наибольшим значением и узнать, сколько они повторяются и первый статус не-NA.

Я решил это следующим образом:

dataset_count <- dataset %>% group_by(id) %>% 
summarise(count = n(), comment = max(status, na.rm = TRUE)) %>% ungroup()

dataset_cross <- dataset %>% arrange(desc(value)) %>% 
left_join(dataset_count) %>% distinct(id, .keep_all = TRUE)

, но так как в моем исходном наборе данных содержится 120 переменных и больше правил, я хотел бы знать, есть ли способ сделать его более компактным. Например, я читал о объединении, но это не позволяет мне извлечь первый NA в сгруппированных данных. Пожалуйста, не могли бы вы дать совет? Спасибо.

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Вы можете получить максимальное значение, используя max, количество строк, используя n(), и первое не-NA значение с which.max для каждого id.

library(dplyr)

dataset %>%
  group_by(id) %>%
  summarise(value = max(value), 
            count = n(), 
            status = status[which.max(!is.na(status))])

#  id    value count status
#  <chr> <dbl> <int> <chr> 
#1 A       500     3 Valid 
#2 B       200     3 NA    
#3 C       500     2 Pend  
.
1 голос
/ 22 января 2020

Вот базовое решение R

dfout <- do.call(rbind,
                 c(make.row.names = F,
                   lapply(split(dataset,dataset$id), 
                          function(v) {
                            data.frame(
                              id = unique(v["id"]),
                              value = max(v["value"]),
                              count = nrow(v),
                              status = v$status[which.max(!is.na(v$status))]
                            )
                          })))

такое, что

> dfout
  id value count status
1  A   500     3  Valid
2  B   200     3   <NA>
3  C   500     2   Pend
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...