[英]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.