R 为什么我总是不知道?
我有一个大数据集,使用R中的package Data.Table。一个变量称为Visa_status,另一个变量称为Master_status。两个变量都可以取这个值:1、3、4、5或NA。我想按照以下逻辑将它们合并到一个名为mv_status的变量中: 如果这两个变量的值为NA,则该值为9。如果其中一个变量为1,则该值为1。任何其他组合都是2。 我的密码是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
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))