【问题标题】:Using data from one column to assign NAs to others使用一列中的数据将 NA 分配给其他列
【发布时间】:2017-11-22 16:08:10
【问题描述】:

目标:根据另一列的值向列添加 NA。例如,如果我有一个包含五列的数据集(一个 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

【问题讨论】:

  • 试试df[[df$nocasedata==1,2:4] &lt;- NA

标签: r tidyverse


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多