首页 > 解决方案 > 计算数据框中的重复行和第一个非 NA 出现

问题描述

我有以下示例数据集:

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)

我需要的是提取这个具有最高值的唯一 id,并有多少重复和第一个非 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。拜托,能给点建议吗?谢谢你。

标签: rtidyverse

解决方案


您可以使用 获取最大值,使用for eachmax计算行数n()和第一个非 NA 值。which.maxid

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  

推荐阅读