2017-04-03 45 views
0

嗨我有一个包含多个列的数据集,这些列填充了NA或“Y”。我希望分别使这些值为0和1。将多个列转换为二进制数据R

我对R相当陌生,试图确定循环这些变量并重新编码它们的最佳方法。

STATE<-c(NA, "WA", "NY", NA, NA) 
x<-c(NA,"Y",NA,NA,"Y") 
y<-c(NA,NA,"Y",NA,"Y") 
z<-c("Y","Y",NA, NA, NA) 
mydata<-data.frame(x,y,z) 

我有一个很大的数据集和许多这些变量。但是,其中一些(如国家),我希望独自离开。任何帮助将不胜感激。谢谢。

回答

1

我认为最好的方法是使用mutate_each()功能从包dplyr

library(dplyr) 

STATE <- c(NA, "WA", "NY", NA, NA) 
x  <- c(NA, "Y", NA, NA, "Y") 
y  <- c(NA, NA, "Y", NA, "Y") 
z  <- c("Y", "Y", NA, NA, NA) 
mydata <- data.frame(x, y, z, STATE) 

mydata <- mutate_each(mydata, funs(ifelse(is.na(.), 0, 1)), -STATE) 

它将应用指定的函数ins ide funs()给每个变量。点.是变量的表示形式。要跳过一个或多个变量,只需在他们的前面写上他们的名字--var1, -var2, ...

1

您可以使用ifelse

ifelse(is.na(mydata),0,ifelse(mydata=="Y",1,mydata) 

这将替换为0 MYDATA的元素,如果他们NA,一个如果他们是“Y”或保存元素,如果他们是别的。

您添加了二进制标签。 R的二进制类型:TRUE/FALSE,所以如果你想二进制,你应该使用

ifelse(is.na(mydata),FALSE,ifelse(mydata=="Y",TRUE,mydata) 

代替。

+0

是否有一种方法仅对选定变量执行此操作(请参阅编辑)?另外,我认为你是对的...二进制是我想要的。也就是说,如果它们在算术函数中解析为1和0。 TRUE + TRUE是否等于2? – pyll

+0

如果你只想修改一些列,你可以像'mydata [c('x','y')] = ifelse(is.na(mydata [c('x','y')]) ,0,ifelse(mydata [c('x','y')] ==“Y”,1,mydata [c('x','y')]))其中包含您想要的列名保持。并且是TRUE + TRUE = 2 – xraynaud

0

首先,你需要确保的特征向量没有编码为因素:

mydata <- data.frame(x,y,z, stringsAsFactors=F) 

然后:

mydata[mydata=="Y"] <- 1 
mydata[is.na(mydata)] <- 0 
mydata 
    x y z 
    1 0 0 1 
    2 1 0 1 
    3 0 1 0 
    4 0 0 0 
    5 1 1 0