如何 select R 中每个组的第一个非 NA 值?
How to select only first non NA value of each group in R?
我有一个像
这样的数据框
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 的重复值。
如果 base R 可以试试这个。 NA
默认省略。
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
一个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
我有一个像
这样的数据框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 的重复值。
如果 base R 可以试试这个。 NA
默认省略。
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
一个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