如何仅选择 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 没问题,试试这个。 NA
s 默认省略。
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 替换为组中的第一个值?