我有一个像这样的
df
,我想通过非常复杂的条件来填充NA
,但我不知道编码..
df <- data.frame(
age = c("age15","age15","age16","age16"),
occo = c("ag","ag","uuse","ag"),
occn = c("tw","uuse","use","uuse"),
num = c(12,NA,567,NA),
occo2 = c("ag","use","ag","use"),
occn2 = c("tw","use","tw","use"),
num2 = c(2,45,67,789)
)
首先,我想通过条件
NA
找到num
列中的occo == "ag" & occn == "uuse"
单元格,然后以条件num2
为occo2 == "ag" & occn2 == "tw"
赋值,即2
。
更重要的是,按 age
组,因此第二个 NA
将被 67
取代。
预期结果将是:
df <- data.frame(
age = c("age15","age15","age16","age16"),
occo = c("ag","ag","uuse","ag"),
occn = c("tw","uuse","use","uuse"),
num = c(12,2,567,67),
occo2 = c("ag","use","ag","use"),
occn2 = c("tw","use","tw","use"),
num2 = c(2,45,67,789)
)
类似这样的事情
df2 <- df %>%
group_by(age) %>%
mutate(num = case_when(
occo == "ag" & occn == "uuse" ~ .[which(occo2 == "ag", occn2 == "tw"),][7]
))
下面的代码创建了所需的输出,但显然不是预期的方式:
df |>
mutate(num = if_else(is.na(num), lag(num2), num))
我对规则的假设是:
对于每个年龄段,有一个 num2 为 occo2 == "ag" & occn2 == "tw",还有一个 num 为 NA,其中 occo == "ag" & occn == "uuse"。
将每个组的 num 值设置为来自同一组且满足上述条件的 num2 值。
不过还不清楚。
一个更长的例子,一个具有原始数据集更多微妙之处的例子将是惊人的!!
我想你需要这样的东西-
library(dplyr)
df %>%
mutate(num = if_else(occo == "ag" & occn == "uuse" & is.na(num),
num2[occo2 == "ag" & occn2 == "tw"], num), .by = age)
# age occo occn num occo2 occn2 num2
#1 age15 ag tw 12 ag tw 2
#2 age15 ag uuse 2 use use 45
#3 age16 uuse use 567 ag tw 67
#4 age16 ag uuse 67 use use 789
基本上这就是说,如果
occo == "ag" & occn == "uuse"
和 num
是 NA
,则将其替换为 num2
中的值,其中 cco2 == "ag" & occn2 == "tw"
或保持 num
原样。
.by
语法在 dplyr
1.1.0 及更高版本中可用。如果您有旧版本的 dplyr
,那么您可以按照示例中的方式添加 group_by(age)
。