按条件查找NA单元格,然后按其他条件赋值

问题描述 投票:0回答:2

我有一个像这样的

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]
))
r conditional-statements na
2个回答
0
投票

下面的代码创建了所需的输出,但显然不是预期的方式:

df |> 
mutate(num = if_else(is.na(num), lag(num2), num))

我对规则的假设是:

对于每个年龄段,有一个 num2 为 occo2 == "ag" & occn2 == "tw",还有一个 num 为 NA,其中 occo == "ag" & occn == "uuse"。

将每个组的 num 值设置为来自同一组且满足上述条件的 num2 值。

不过还不清楚。

一个更长的例子,一个具有原始数据集更多微妙之处的例子将是惊人的!!


0
投票

我想你需要这样的东西-

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)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.