目标:根据另一列的值向列添加NAs。例如,如果我有一个包含五列的数据集(一个ID列和四个二进制变量:caseID,var1,var2,var3,nocasedata),我如何评估来自" nocasedata"的数据。确定TRUE(无数据)或FALSE(数据),然后删除该列并为其他三个变量分配NA(如果为TRUE)或对该情况的整行执行任何操作(如果为FALSE)。 (tidyverse工具首选,但不是必需的。)
可重复的例子:
df <- data.frame(caseID = c(1:5),
var1 = c(1, 0, 0, 1, 1),
var2 = c(0, 0, 1, 1, 0),
var3 = c(0, 0, 0, 1, 1),
nocasedata = c(0, 1, 0, 0, 0))
df
desired_df <- data.frame(caseID = c(1:5),
var1 = c(1, NA, 0, 1, 1),
var2 = c(0, NA, 1, 1, 0),
var3 = c(0, NA, 0, 1, 1))
desired_df
答案 0 :(得分:1)
以下是根据要求使用tidyverse工具的解决方案的代表。
library(tidyverse)
#> -- Attaching packages ---------------------------------------------------- tidyverse 1.2.1 --
#> v ggplot2 2.2.1 v purrr 0.2.4
#> v tibble 1.3.4 v dplyr 0.7.4
#> v tidyr 0.7.2 v stringr 1.2.0
#> v readr 1.1.1 v forcats 0.2.0
#> -- Conflicts ------------------------------------------------------- tidyverse_conflicts() --
#> x dplyr::filter() masks stats::filter()
#> x dplyr::lag() masks stats::lag()
df <- data.frame(caseID = c(1:5),
var1 = c(1, 0, 0, 1, 1),
var2 = c(0, 0, 1, 1, 0),
var3 = c(0, 0, 0, 1, 1),
nocasedata = c(0, 1, 0, 0, 0))
df
#> caseID var1 var2 var3 nocasedata
#> 1 1 1 0 0 0
#> 2 2 0 0 0 1
#> 3 3 0 1 0 0
#> 4 4 1 1 1 0
#> 5 5 1 0 1 0
desired_df = df %>%
mutate_at(.vars = vars(var1:var3),
.funs = funs(ifelse(nocasedata == 1, NA, .))) %>%
select(-nocasedata)
desired_df
#> caseID var1 var2 var3
#> 1 1 1 0 0
#> 2 2 NA NA NA
#> 3 3 0 1 0
#> 4 4 1 1 1
#> 5 5 1 0 1