防止R中的ifelse()将因子转换为数字

时间:2016-09-06 13:57:20

标签: r

我有一个数据框,data1:

ID <- c('ID1','ID2','ID3','ID4','ID5','ID6','ID7')
cr <- c(1,1,"d","d","e","e","e")
hr <- c(TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE)
br <- c(FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE)
data1 <- data.frame(ID,cr,hr,br)

   ID cr    hr    br
1 ID1  1  TRUE FALSE
2 ID2  1  TRUE  TRUE
3 ID3  d FALSE  TRUE
4 ID4  d  TRUE  TRUE
5 ID5  e FALSE FALSE
6 ID6  e FALSE FALSE
7 ID7  e FALSE FALSE

我想应用以下ifelse语句:

first<-2;last<-length(data1)
for (to_na in first : last){
    if(names(data1)[to_na]!="att"){
    data1[,to_na]<-
     ifelse(data1$hr|data1$br ,NA,data1[,to_na])
}

但结果如下:

   ID cr    hr    br
1 ID1 NA    NA    NA
2 ID2 NA    NA    NA
3 ID3 NA    NA    NA
4 ID4 NA    NA    NA
5 ID5  3 FALSE FALSE
6 ID6  3 FALSE FALSE
7 ID7  3 FALSE FALSE

你会注意到&#34; e&#34;在data1 $ cr中已经转换为3,因为data1 $ cr中的第一行以数字开头(它将该列转换为数字类,而不是将其保留为因子类)。避免这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

可能有更好的方法可以做到这一点,但保留代码可以做到这一点:

index <- data1$hr|data1$br
first<-2;last<-length(data1)

for (i in first : last){
  if(names(data1)[i]!="att"){
    data1[index,i] <- NA  }}