【发布时间】:2020-03-24 10:32:04
【问题描述】:
如果 status = NA,则 score_1:score_3 将为 NA
试过了:
if(df2$status == NA){
df2$score_2 <- NA
}else{
df2$score_2 <- df$score_2
}
提前致谢
【问题讨论】:
标签: r conditional-statements na
如果 status = NA,则 score_1:score_3 将为 NA
试过了:
if(df2$status == NA){
df2$score_2 <- NA
}else{
df2$score_2 <- df$score_2
}
提前致谢
【问题讨论】:
标签: r conditional-statements na
您可以通过找出数据框中的哪些行是NA,然后将这些行中的列设置为NA来做到这一点。
df <- data.frame(client_id = 1:4,
Date = 1:4,
Status = c(1, NA, 1, NA),
Score1 = runif(4)*100,
Score2 = runif(4)*100,
Score3 = runif(4)*100)
idx <- is.na(df$Status)
df[idx, 4:6] <- NA
df
#> client_id Date Status Score1 Score2 Score3
#> 1 1 1 1 48.08677 16.62185 91.80062
#> 2 2 2 NA NA NA NA
#> 3 3 3 1 14.04552 64.55724 56.45998
#> 4 4 4 NA NA NA NA
【讨论】:
NA 行。
一种选择是在“状态”中找到NAs,并将以“分数”作为列名的列分配给base R中的NA
i1 <- is.na(df2$Status)
df2[i1, grep("^Score_\\d+$", names(df2))] <- NA
或者dplyr中的一个选项
library(dplyr)
df2 %>%
mutate_at(vars(starts_with('Score')), ~ replace(., is.na(Status), NA))
【讨论】:
Status,而在您的代码中它是status。 R 区分大小写。因此,请将名称更改为正确的列名。我更新了代码
colnames(df2)。可能有一些领先/落后的空间