在for()循环中使用if()语句

时间:2013-10-26 05:14:10

标签: r

一个看似简单的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]}
    }

2 个答案:

答案 0 :(得分:2)

您可以在一行中执行此操作。例如:

Table$NewField <- ifelse(Table$TrueFalse=="TRUE",Table$Number,-1)

此外,如果您使用TRUEFALSE而不是“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)