- r - 如何使用函数将具有字符值的多个列转换为巨大的data.frame中的二进制数字?

  显示原文与译文双语对照的内容

我拥有一个具有数值,字符和缺失值的巨大 data.frame 。 如何将所有"true"和"false"( 字符值) 转换为 1和 0,同时保留丢失的值?

我尝试使用dplyr编码函数,但它不适用于 data.frame. 类的对象


df <- data.frame(Var1 = 150:154, Var2 = c("True","True","","False","True"), 


Var3 = c("","True","True","False","True"), 


Var4 = 1116:1120, Var99 = c("","True","","False","True"))




> df


 Var1 Var2 Var3 Var4 Var99


1 150 True 1116 


2 151 True True 1117 True


3 152 True 1118 


4 153 False False 1119 False


5 154 True True 1120 True



我的输出是:

> df2


 Var1 Var2 Var3 Var4 Var99


1 150 1 1116 


2 151 1 1 1117 1


3 152 1 1118 


4 153 0 0 1119 0


5 154 1 1 1120 1



时间:

你可以使用dplyr函数 mutate_ifcase_when 。 为简单起见,在创建 data.frame. 时将stringsAsFactors设置为 false


df <- data.frame(Var1 = 150:154, Var2 = c("True","True","","False","True"), 


 Var3 = c("","True","True","False","True"), 


 Var4 = 1116:1120, Var99 = c("","True","","False","True"), stringsAsFactors = FALSE)



df %>% 


 mutate_if(is.character, ~case_when(. =="True" ~ 1L, 


. =="False" ~ 0L, 


. =="" ~ NA_integer_))



带有 as.logicalas.numeric的基本 R 方法:


> df[c("Var2","Var3","Var99")] <- lapply(df[c("Var2","Var3","Var99")], function(x){


+ as.numeric(as.logical(x))


+ })


> df


 Var1 Var2 Var3 Var4 Var99


1 150 1 NA 1116 NA


2 151 1 1 1117 1


3 152 NA 1 1118 NA


4 153 0 0 1119 0


5 154 1 1 1120 1




> vars_logic <- sapply(df, function(x) {all(x %in% c('True', 'False', ''))})


> 


> df[vars_logic] <- lapply(df[vars_logic], function(x){


+ as.numeric(as.logical(x))


+ })


> 


> df


 Var1 Var2 Var3 Var4 Var99


1 150 1 NA 1116 NA


2 151 1 1 1117 1


3 152 NA 1 1118 NA


4 153 0 0 1119 0


5 154 1 1 1120 1



考虑到 true/false的所有列都是因素,你可以尝试这个 dplyr 解决方案( 但是,也可以查看 @akrun): 提供的注释) 。


df %>%


 mutate_if(is.factor, list(~ as.logical(.) * 1))



 Var1 Var2 Var3 Var4 Var99


1 150 1 NA 1116 NA


2 151 1 1 1117 1


3 152 NA 1 1118 NA


4 153 0 0 1119 0


5 154 1 1 1120 1



或者根据 @Santiago Capobianco的想法稍作修改:


df %>%


 mutate_if(is.factor, list(~ as.numeric(as.logical(.))))



一个选项是 mutate_if,并将值重新编码为 1,用来自 forcatsfct_recode 进行 0


library(dplyr)


library(forcats)


df %>% 


 mutate_if(is.factor, list(~ fct_recode(.,"1" ="True","0" ="False" )))


# Var1 Var2 Var3 Var4 Var99


#1 150 1 1116 


#2 151 1 1 1117 1


#3 152 1 1118 


#4 153 0 0 1119 0


#5 154 1 1 1120 1



注意:这些列不是逻辑( TRUE/FALSE ),而是( TRUE/FALSE ) 。 因此,在不使用任何其他假设的情况下保持数据集对象

NOTE2: 在转换后不会更改列类型

若要转换为数值,可以使用 match 进行


df %>%


 mutate_if(is.factor, list( ~ match(., c("False","True")) - 1))



...