【问题标题】:Why I keep getting NA?为什么我一直得到NA?
【发布时间】:2021-05-22 00:07:40
【问题描述】:

我有一个大数据集,使用 R 中的 Data.Table 包。一个变量称为 Visa_status,另一个是 Master_status。两个变量都可以采用以下值:1、3、4、5 或 NA。我想按照以下逻辑将它们组合在一个名为 mv_status 的变量中: 如果两个变量的值为 NA,则值为 9。如果其中一个变量为 1,则值为 1。任何其他组合为 2。 我的代码是这样的

dataset[ , mv_status08       := ifelse( is.na(Master_status) & is.na(Visa_status), 9, 
                                        ifelse(Master_status == 1 | Visa_status == 1, 1, 2))]

我的输出是这样的:

   Visa_status Master_status mv_status08 N
 1:           1             1           1 164946
 2:          NA            NA           9   6120
 3:           1            NA           1  16590
 4:           1             5           1     58
 5:          NA             1           1    775
 6:           4             4           2    218
 7:           4             3           2      8
 8:           5            NA          NA     85
 9:           5             5           2    364
10:           3             3           2    271
11:           5             1           1     30
12:           3             1           1      8
13:           3             4           2     12
14:           4            NA          NA     81
15:           4             1           1     35
16:          NA             5          NA     14
17:           3            NA          NA    101
18:           1             4           1     15
19:           4             5           2      2
20:          NA             3          NA     72
21:          NA             4          NA     20
22:           1             3           1      1
23:           5             3           2      4
24:           3             5           2      4
25:           5             4           2      2
    Visa_status Master_status mv_status08      N

当变量之一中有 NA 时,为什么我会得到 NA?我的代码的最后一步不应该解决这个问题吗?

【问题讨论】:

  • 没有。那是因为 Master_status == 1 | Visa_status == 1 有 3 个值,一个 TRUE, FALSE, NA。所以当TRUE它返回1,当FALSE它返回2,当NA它返回NA
  • 您检查两列是否为NA,而不是任一列。
  • 仅供参考,如果您使用的是data.table,请使用其fifelse 代替base::ifelse。或者,使用dplyr::if_else,两者都对非原子向量更具弹性,并且是类安全的,其中base::ifelse 将高兴地(a)从其值中剥离类,并且(b)不尝试总是返回相同的值如果参数不明确则分类。
  • 如果您在当前-NA 行中提供您期望的值,那么给您一个确定的答案会更容易。

标签: r dplyr data.table


【解决方案1】:

使用fcase

library(data.table)

dataset[ , mv_status08:= fcase(is.na(Master_status) & is.na(Visa_status), 9, 
                               Master_status == 1 | Visa_status == 1, 1, 
                               default = 2)]

【讨论】:

    【解决方案2】:

    你可以这样做:

    df[ , mv_status08 := ifelse(is.na(Master_status) & is.na(Visa_status), 9, 
                           ifelse(is.na(Master_status) | is.na(Visa_status), 2, 
                             ifelse(Master_status == 1 | Visa_status == 1, 1, 2)))]
    ]
    
     df
        Visa_status Master_status mv_status08      N
     1:           1             1           1 164946
     2:          NA            NA           9   6120
     3:           1            NA           2  16590
     4:           1             5           1     58
     5:          NA             1           2    775
     6:           4             4           2    218
     7:           4             3           2      8
     8:           5            NA           2     85
     9:           5             5           2    364
    10:           3             3           2    271
    11:           5             1           1     30
    12:           3             1           1      8
    13:           3             4           2     12
    14:           4            NA           2     81
    15:           4             1           1     35
    16:          NA             5           2     14
    17:           3            NA           2    101
    18:           1             4           1     15
    19:           4             5           2      2
    20:          NA             3           2     72
    21:          NA             4           2     20
    22:           1             3           1      1
    23:           5             3           2      4
    24:           3             5           2      4
    25:           5             4           2      2
        Visa_status Master_status mv_status08      N
    

    【讨论】:

      【解决方案3】:

      使用case_when

      library(dplyr)
      dataset %>%
        mutate(my_status08 = case_when(is.na(Master_status) & is.na(Visa_status) ~ 9,
                    Master_status == 1| Visa_status == 1 ~ 1, TRUE ~ 2))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-09
        • 1970-01-01
        相关资源
        最近更新 更多