R 为什么我总是不知道?

R 为什么我总是不知道?,r,dplyr,data.table,R,Dplyr,Data.table,我有一个大数据集,使用R中的package 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

我有一个大数据集,使用R中的package 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?我的代码的最后一步不应该解决这个问题吗?

您可以:

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
你可以做:

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
使用fcase:

使用fcase:

使用case_时

使用case_时


不。这是因为Master_status==1 | Visa_status==1有3个值,一个为真,一个为假,一个为NA。因此,如果为TRUE,则返回1;如果为FALSE,则返回2;如果为NA,则返回Nay。您可以检查两列是否都为NA,而不是任何一列。FYI,如果您使用的是data.table,则使用其fifelse代替base::ifelse。或者,使用dplyr::if_else,两者对非原子向量都更具弹性,并且都是类安全的,其中base::ifelse很乐意将类从其值中剥离,如果参数不明确,b不会尝试始终返回同一个类。如果您在当前NA行中提供所需的值,则更容易给出可靠的答案。否。这是因为Master_status==1 | Visa_status==1有3个值,一个为真,一个为假,一个为NA。因此,如果为TRUE,则返回1;如果为FALSE,则返回2;如果为NA,则返回Nay。您可以检查两列是否都为NA,而不是任何一列。FYI,如果您使用的是data.table,则使用其fifelse代替base::ifelse。或者,使用dplyr::if_else,两者对非原子向量都更具弹性,并且都是类安全的,其中base::ifelse很乐意将类从其值中剥离,如果参数不明确,b不会尝试总是返回同一个类。如果您在当前NA行中提供所需的值,则更容易给出确切的答案。
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))