如何仅选择 R 中每个组的第一个非 NA 值?

Posted

技术标签:

【中文标题】如何仅选择 R 中每个组的第一个非 NA 值?【英文标题】:How to select only first non NA value of each group in R? 【发布时间】:2022-01-07 15:25:38 【问题描述】:

我有一个类似的数据框

mydata <- data.frame(Id=c(01,01,01,01,01,01,02,02,02,02),
                     VISIT=c("Screeing","Baseline","Baseline","Baseline","Week 9","Week 9","Baseline","Week 2",
                             "Week 2","Week 2"),
                    Score=c(1,2,4,5,78,9,5,NA,3,4))

> mydata
   Id    VISIT Score
1   1 Screeing     1
2   1 Baseline     2
3   1 Baseline     4
4   1 Baseline     5
5   1   Week 9    78
6   1   Week 9     9
7   2 Baseline     5
8   2   Week 2     NA
9   2   Week 2     3
10  2   Week 2     4

我要做的是按 Id 和 VISIT 分组,并选择每个组的第一个非 NA 值作为

> mydata

      Id VISIT    Score 
   <dbl> <fct>    <dbl> 
 1     1 Screeing     1     
 2     1 Baseline     2     
 5     1 Week 9      78    
 7     2 Baseline     5     
 9     2 Week 2       3     

我想到了这个

mydata<-mydata %>%
 group_by(Id,VISIT) %>% 
 mutate(first = dplyr::first(na.omit(Score)))

但它不会删除其他行,它只是创建一个新列,其中每个组的第一个非 NA 重复值。

【问题讨论】:

您的代码中有错字。 dplyr::first(na.omit(SCORE))) 分数不应该是大写,而是分数。与列名相同。 使用summarise 而不是mutate 【参考方案1】:

如果 base R 没问题,试试这个。 NAs 默认省略。

aggregate( Score ~ Id + VISIT, mydata, function(x) x[1] )

  Id    VISIT Score
1  1 Baseline     2
2  2 Baseline     5
3  1 Screeing     1
4  2   Week 2     3
5  1   Week 9    78

【讨论】:

@Katie VISIT 没有被重复。请注意,ID 会发生变化。 @Onyambu 感谢您的提示。尝试构建示例并找到解决方法。 我删除了评论。 OP 编辑​​了问题,似乎 NA 仅出现在 Score 列中,因此您的代码是正确的。如果 NA 出现在其他列中,那么我们将不得不将自己限制在仅分数列中。 @Onyambu Gotcha。无论如何,谢谢!【参考方案2】:

dplyr 替代方案。假设“第一”只是指第一行,按照给定的顺序,按组。

请注意,示例数据中的 (Id, VISIT) 为 Baseline 提供了 2 个组。

library(dplyr)

mydata %>% 
  group_by(Id, VISIT) %>% 
  filter(!is.na(Score)) %>% 
  slice(1) %>% 
  ungroup()

结果:

# A tibble: 5 x 3
     Id VISIT    Score
  <dbl> <chr>    <dbl>
1     1 Baseline     2
2     1 Screeing     1
3     1 Week 9      78
4     2 Baseline     5
5     2 Week 2       3

【讨论】:

以上是关于如何仅选择 R 中每个组的第一个非 NA 值?的主要内容,如果未能解决你的问题,请参考以下文章

R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值

如何填充(自动填充)值,例如使用 R 中的 data.table 将 NA 替换为组中的第一个值?

SQLite - 每个组的第一个 - 复合顺序和相反的排序顺序

如何在 SQL 查询中选择每个组的第一行?

R - 如何在NA中填写值,但仅当结束值与起始值相同时?

R语言如何取分组的第一个值或最后一个值?