使用一列中的数据将NA分配给其他列

时间:2017-11-22 16:08:10

标签: r tidyverse

目标:根据另一列的值向列添加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

1 个答案:

答案 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