我在一个数据框中有一系列行。我正在尝试聚合每个 ID 的前两行 - 即 - 我想将 ID 1 的事件 1 和 2 组合成一行,将 ID 2 的事件 1 和 2 组合成单行等,但完全保留事件 3未受影响。
id <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)
event <- c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3)
score <- c(3,NA,1,3,NA,2,6,NA,1,8,NA,2,4,NA,1)
score2 <- c(NA,4,1,NA,5,2,NA,0,3,NA,5,6,NA,8,7)
df <- tibble(id, event, score, score2)
# A tibble: 15 x 4
id event score score2
<dbl> <dbl> <dbl> <dbl>
1 1 1 3 NA
2 1 2 NA 4
3 1 3 1 1
4 2 1 3 NA
5 2 2 NA 5
6 2 3 2 2
7 3 1 6 NA
8 3 2 NA 0
9 3 3 1 3
10 4 1 8 NA
11 4 2 NA 5
12 4 3 2 6
13 5 1 4 NA
14 5 2 NA 8
15 5 3 1 7
我已经尝试过:
df_merged<- df %>% group_by (id) %>% summarise_all(funs(min(as.character(.),na.rm=TRUE))),
它很好地聚合了这些,但后来我很难将它们合并回原始数据帧/tibble(完整数据集中实际上有大约 300 个不同的“分数”列,因此 right_join 对于 Score.x、score 来说是一个令人头疼的问题.y、score2.x、score2.y 到处都是...)
理想情况下,情况需要是 dplyr,因为我的其余代码在此运行!
编辑:
理想情况下,我的预期输出是:
# A tibble: 10 x 4
id event score score2
<dbl> <dbl> <dbl> <dbl>
1 1 1 3 4
3 1 3 1 1
4 2 1 3 5
6 2 3 2 2
7 3 1 6 0
9 3 3 1 3
10 4 1 8 5
12 4 3 2 6
13 5 1 4 8
15 5 3 1 7
最佳答案
我们可以使用replace
更改NA
元素的顺序
library(dplyr)
df %>%
group_by(id) %>%
mutate(across(starts_with('score'),
~replace(., 1:2, .[1:2][order(is.na(.[1:2]))]))) %>%
ungroup %>%
filter(if_all(starts_with('score'), Negate(is.na)))
-输出
# A tibble: 10 x 4
id event score score2
<dbl> <dbl> <dbl> <dbl>
1 1 1 3 4
2 1 3 1 1
3 2 1 3 5
4 2 3 2 2
5 3 1 6 0
6 3 3 1 3
7 4 1 8 5
8 4 3 2 6
9 5 1 4 8
10 5 3 1 7
关于r - DPLYR - 使用列值作为条件将行合并在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69238353/