是否有更快的方法来重新分类调查变量?

时间:2014-10-10 19:17:41

标签: r

我正在使用以奇怪方式编码的调查数据。调查表明,“在以下行中输入您使用的机器的代码:”

1:卡车

2:装载机

3:平板

4 - 9:等等。

第1行:

第2行:

...

第7行:

我能弄清楚如何将数据重新编码为每个机器的变量的唯一方法是使用这些大的ifelse语句

importpath <- "C:/"

mydata <- read.table(paste0(importpath,"/","Machinery.csv"), header=TRUE, 
                     sep=",", row.names="ID")

mydata$Truck <- ifelse(mydata$Line1 == 1, 1, 
                ifelse(mydata$Line2 == 1, 1,
                ifelse(mydata$Line3 == 1, 1,
                ifelse(mydata$Line4 == 1, 1,
                ifelse(mydata$Line5 == 1, 1,
                ifelse(mydata$Line6 == 1, 1, 
                ifelse(mydata$Line7 == 1, 1, 
                                    0)))))))

mydata$Loader <- ifelse(mydata$Line1 == 2, 1, 
                ifelse(mydata$Line2 == 2, 1,
                ifelse(mydata$Line3 == 2, 1,
                ifelse(mydata$Line4 == 2, 1,
                ifelse(mydata$Line5 == 2, 1,
                ifelse(mydata$Line6 == 2, 1, 
                ifelse(mydata$Line7 == 2, 1, 
                                    0)))))))

mydata$FlatBed <- ifelse(mydata$Line1 == 3, 1, 
                ifelse(mydata$Line2 == 3, 1,
                ifelse(mydata$Line3 == 3, 1,
                ifelse(mydata$Line4 == 3, 1,
                ifelse(mydata$Line5 == 3, 1,
                ifelse(mydata$Line6 == 3, 1, 
                ifelse(mydata$Line7 == 3, 1, 
                                    0)))))))

1 个答案:

答案 0 :(得分:2)

我真的希望你花时间创建一个reproducible example。最好提供一个真实的数据示例,而不是我们必须猜测您正在阅读的文件中的内容。但我猜你的测试数据看起来像这样(只有三个类别)

dd<-data.frame(Line1=c(3,1,2,0,1), 
    Line2=c(0,2,0,0,3),
    Line3=c(0,3,0,NA,1)
)

然后你可以做

dd$Truck <- mapply(`%in%`, 1, split(dd[, paste0("Line",1:3)], 1:nrow(dd)))
dd$Loader <- mapply(`%in%`, 2, split(dd[, paste0("Line",1:3)], 1:nrow(dd)))
dd$FlatBed <- mapply(`%in%`, 3, split(dd[, paste0("Line",1:3)], 1:nrow(dd)))

我们只是检查1,2或3是否在任何列中。这对NA值很稳健。如果您没有任何NA值且只有全零,则可以

dd$Truck <- apply(dd[, paste0("Line",1:3)]==1, 1, any)
dd$Loader <- apply(dd[, paste0("Line",1:3)]==2, 1, any)
dd$FlatBed <- apply(dd[, paste0("Line",1:3)]==3, 1, any)