2013-10-26 237 views
0

一个看似简单的R任务让我难以置信......我在这里看到了一个N​​umberField字段和一个DataFrame中的TrueFalse字段。在for()循环中使用if()语句

#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新列。 在元代码:

对于每一行,新野==号码,如果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

首先,在转换为数据框之前,您不希望cbind列。 cbind将强制结果为任何数据类型与所有列兼容,因此在这种情况下,它会将您的Number变量转换为字符。可能不是你想要的,如果不是现在,那么最终。

其次,R有一个逻辑数据类型,所以你应该使用它。特别是如果你有值“真”和“假”。

因此:

TrueFalse <- rep(c(TRUE, TRUE, FALSE),10) 
Table <- data.frame(TrueFalse, Number) 

Table$NewField <- ifelse(Table$TrueFalse, Table$Number, -1) 
2

你可以在一行中做到这一点。例如:

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

另外,如果你使用过TRUEFALSE,而不是“真”和“假”,你就不需要要么使用相等测试。