我有一个数据框架,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
您将注意到data1$cr中的"e"已被转换为3,因为data1$cr中的第一行以数字开头(它将该列转换为数字类,而不是将其保留为因子类)。避免这种情况的最好方法是什么?
可能有更好的方法来做到这一点但保留你的代码你可以这样做:
index <- data1$hr|data1$br
first<-2;last<-length(data1)
for (i in first : last){
if(names(data1)[i]!="att"){
data1[index,i] <- NA }}