一个看似简单的R任务让我感到难过......我在data.frame中有一个Number字段和一个TrueFalse字段,如下所示。
#Make Data
TrueFalse <- rep(c("TRUE","TRUE", "FALSE"),10)
Number <- seq(1, length(TrueFalse),3)
Table <- as.data.frame(cbind(TrueFalse, Number))
查看head()
head(Table)
如果TrueFalse字段为TRUE,我正在尝试创建一个包含Numbers列中值的新列。 在元代码中:
对于每一行,NewField == Number如果TrueFalse = True,否则没有(即保留为NA)
我的工作代码如下。虽然搜索效率很高,但我仍然缺少一些步骤。在此先感谢您的帮助!
#for() loop using if()
NewField <- rep("NA", nrow(Table))
for (i in 1:nrow(NewField)){
if(Table$TrueFalse[i] == "TRUE")
{NewField[i] <- Table$Number[i]}
}
答案 0 :(得分:2)
您可以在一行中执行此操作。例如:
Table$NewField <- ifelse(Table$TrueFalse=="TRUE",Table$Number,-1)
此外,如果您使用TRUE
和FALSE
而不是“TRUE”和“FALSE”,则您也不需要使用相等性测试。
答案 1 :(得分:2)
首先,在转换为数据框之前,您不希望cbind
列。 cbind
会强制结果为与您的所有列兼容的数据类型,因此在这种情况下,它会将您的Number
变量转换为字符。可能不是你想要的,如果不是现在,那么最终。
其次,R具有逻辑数据类型,因此您应该使用它。特别是如果你有名为“TRUE”和“FALSE”的值。
因此:
TrueFalse <- rep(c(TRUE, TRUE, FALSE),10)
Table <- data.frame(TrueFalse, Number)
Table$NewField <- ifelse(Table$TrueFalse, Table$Number, -1)