我有以下数据框,其中“ id”通常根本没有收到“ a”。因此,对于该“ id”,列“ a”中的所有值均为NA。
id a b c
1 14 1 2 NA
2 14 2 4 1
3 15 NA 8 1
4 15 NA NA 3
5 15 NA 1 3
6 26 2 4 4
7 26 NA 2 0
8 26 2 9 1
如果id根本没有收到“ a”,我想用b + c替换那些NA值。但仅当b和c存在时。因此,数据框将如下所示:
id a b c
1 14 1 2 NA
2 14 2 4 1
3 15 9 8 1
4 15 NA NA 3
5 15 4 1 3
6 26 2 4 4
7 26 NA 2 0
8 26 2 9 1
现在我有了这个,但是找不到基于id的方法。它还更改了第7行,这不会发生,因为ID 26确实收到了一些“ a”
df$a <- ifelse(is.na(df$a), df$b+df$c, df$a)
id a b c
1 14 1 2 NA
2 14 2 4 1
3 15 9 8 1
4 15 NA NA 3
5 15 4 1 3
6 26 2 4 4
7 26 2 2 0
8 26 2 9 1
我们可以coalesce
在按“ id”分组后使用
library(dplyr)
df %>%
group_by(id) %>%
mutate(a = if(all(is.na(a))) coalesce(a, b + c) else a)
# A tibble: 8 x 4
# Groups: id [3]
# id a b c
# <int> <int> <int> <int>
#1 14 1 2 NA
#2 14 2 4 1
#3 15 9 8 1
#4 15 NA NA 3
#5 15 4 1 3
#6 26 2 4 4
#7 26 NA 2 0
#8 26 2 9 1
df <- structure(list(id = c(14L, 14L, 15L, 15L, 15L, 26L, 26L, 26L),
a = c(1L, 2L, NA, NA, NA, 2L, NA, 2L), b = c(2L, 4L, 8L,
NA, 1L, 4L, 2L, 9L), c = c(NA, 1L, 1L, 3L, 3L, 4L, 0L, 1L
)), class = "data.frame", row.names = c("1", "2", "3", "4",
"5", "6", "7", "8"))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句