复杂的变量生成与条件针对 R 中的多个因子变量
Intrincate variable generation with conditionals against multiple factor variables in R
我正在尝试使用针对因子变量进行评估的多个条件来生成一个新变量。
所以,假设我有这个因子变量 data.frame
x<-c("1", "2", "1","NA", "1", "2", "NA", "1", "2", "2", "NA" )
y<-c("1","NA", "2", "1", "1", "NA", "2", "1", "2", "1", "1" )
z<-c("1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3")
w<- c("01", "02", "03", "04","05", "06", "07", "01", "02", "03", "04")
df<-data.frame(x,y,z,w)
df$x<-as.factor(df$x)
df$y<-as.factor(df$y)
df$z<-as.factor(df$z)
df$w<-as.factor(df$w)
str(df)
所以我需要在我的数据框上获得一个新的 v 列,它采用 1、0 或 NA
之间的值,并具有以下条件:
在以下情况下取值 1:x =“1”,y =“1”,z =“1”或“2”,w =“01”至“06”
如果不满足至少一个条件,则取值 0。
如果 x、y、z 或 w 中的任何一个为 NA
,则取值 NA
。
曾尝试在 mutate
和 case_when
上使用管道 %>%
,但未能成功。
所以我想要的结果是 df
中的新列 v
看起来像这样:
[1] 1 NA 0 NA 1 NA NA 0 0 0 NA
这里我也用mutate
和case_when
。由于数据集中的 NA
是字符“NA”(“NA”的文字字符串),我们无法使用 is.na()
之类的函数来识别它。建议将其更改为“真实”NA
(通过删除输入中的双引号)。
正如我在评论中指出的,我不确定为什么第八个条目是“1”,而对应的 z
不是“1”或“2”。
library(dplyr)
df %>% mutate(v = case_when(x == "1" & y == "1" & z %in% c("1", "2") & w %in% paste0(0, seq(1:6)) ~ "1",
x == "NA" | y == "NA" | z == "NA" | w == "NA" ~ NA_character_,
T ~ "0"))
x y z w v
1 1 1 1 01 1
2 2 NA 2 02 <NA>
3 1 2 3 03 0
4 NA 1 4 04 <NA>
5 1 1 1 05 1
6 2 NA 2 06 <NA>
7 NA 2 3 07 <NA>
8 1 1 4 01 0
9 2 2 1 02 0
10 2 1 2 03 0
11 NA 1 3 04 <NA>
我正在尝试使用针对因子变量进行评估的多个条件来生成一个新变量。
所以,假设我有这个因子变量 data.frame
x<-c("1", "2", "1","NA", "1", "2", "NA", "1", "2", "2", "NA" )
y<-c("1","NA", "2", "1", "1", "NA", "2", "1", "2", "1", "1" )
z<-c("1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3")
w<- c("01", "02", "03", "04","05", "06", "07", "01", "02", "03", "04")
df<-data.frame(x,y,z,w)
df$x<-as.factor(df$x)
df$y<-as.factor(df$y)
df$z<-as.factor(df$z)
df$w<-as.factor(df$w)
str(df)
所以我需要在我的数据框上获得一个新的 v 列,它采用 1、0 或 NA
之间的值,并具有以下条件:
在以下情况下取值 1:x =“1”,y =“1”,z =“1”或“2”,w =“01”至“06”
如果不满足至少一个条件,则取值 0。
如果 x、y、z 或 w 中的任何一个为 NA
,则取值 NA
。
曾尝试在 mutate
和 case_when
上使用管道 %>%
,但未能成功。
所以我想要的结果是 df
中的新列 v
看起来像这样:
[1] 1 NA 0 NA 1 NA NA 0 0 0 NA
这里我也用mutate
和case_when
。由于数据集中的 NA
是字符“NA”(“NA”的文字字符串),我们无法使用 is.na()
之类的函数来识别它。建议将其更改为“真实”NA
(通过删除输入中的双引号)。
正如我在评论中指出的,我不确定为什么第八个条目是“1”,而对应的 z
不是“1”或“2”。
library(dplyr)
df %>% mutate(v = case_when(x == "1" & y == "1" & z %in% c("1", "2") & w %in% paste0(0, seq(1:6)) ~ "1",
x == "NA" | y == "NA" | z == "NA" | w == "NA" ~ NA_character_,
T ~ "0"))
x y z w v
1 1 1 1 01 1
2 2 NA 2 02 <NA>
3 1 2 3 03 0
4 NA 1 4 04 <NA>
5 1 1 1 05 1
6 2 NA 2 06 <NA>
7 NA 2 3 07 <NA>
8 1 1 4 01 0
9 2 2 1 02 0
10 2 1 2 03 0
11 NA 1 3 04 <NA>