繁体   English   中英

在数据帧的每一行中选择2个相应的列

[英]Selecting 2 corresponding columns in each row of a data frame

我很抱歉,因为这似乎是一个基本问题,但我一直在寻找更好的解决方案,但没有找到它。 我有以下类型的数据。

myDATA<-data.frame(rbind(c("red","blue","green", "dog","hat","cat")
                     ,c("blue","green", "blue","dog","hat","cat")
                     ,c("green","blue","blue","dog","hat","cat")
                     ,c("green","red", "blue","dog","hat","cat")
                     )
               )
names(myDATA)<-c(paste("Color",1:3,sep=""),paste("Stim",1:3,sep=""))
myDATA$greenImage<-NA

这使:

myDATA

+-----------------------------------------------------+
|   Color1 Color2 Color3 Stim1 Stim2 Stim3 greenImage |
+-----------------------------------------------------+
| 1    red   blue  green   dog   hat   cat         NA |
| 2   blue  green   blue   dog   hat   cat         NA |
| 3  green   blue   blue   dog   hat   cat         NA |
| 4  green    red   blue   dog   hat   cat         NA |
+-----------------------------------------------------+

Color的列对应与Stim通过数量,例如柱, Stim1显示在Color1等。 对于每一行,一个Stim以绿色显示。 我想找到该Stim并保存在名为greenImage的新列中。

我从许多贴子中收集了apply()在这里可能有用,但我无法使其工作。 我不太优雅的解决方案是以下形式的循环,

for (i in 1:nrow(myDATA)) {
  x <- match("green", unlist(myDATA[i,paste("Color", 1:3, sep="")]))
  myDATA[i,"greenImage"] <- as.character(myDATA[i, paste("Stim", x, sep="")])
}

导致:

myDATA
+-----------------------------------------------------+
|   Color1 Color2 Color3 Stim1 Stim2 Stim3 greenImage |
+-----------------------------------------------------+
| 1    red   blue  green   dog   hat   cat        cat |
| 2   blue  green   blue   dog   hat   cat        hat |
| 3  green   blue   blue   dog   hat   cat        dog |
| 4  green    red   blue   dog   hat   cat        dog |
+-----------------------------------------------------+

但是,实际的数据集有10000行以上,因此我的解决方案效率很低。 谁能建议一种更有效的替代方法?

提前致谢!

只需使用ifelse向量化您的比较:

for (i in 1:3) {
  myDATA$greenImage = ifelse (myDATA[,i] == "green",
                              as.character(myDATA[,i+3]),
                              myDATA$greenImage)
}

请注意,需要as.character才能从您的factor获取字符串。 如果在创建data.frame时使用stringsAsFactors = FALSE ,则可以避免这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM