0

一个看似简单的 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 列中的值的新列。在元代码中:

对于每一行,如果 TrueFalse = True,则 NewField ==Number,否则什么都没有(即保留为 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]}
    }
4

2 回答 2

2

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

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

此外,如果您使用TRUEandFALSE而不是“TRUE”和“FALSE”,则也不需要使用相等测试。

于 2013-10-26T05:29:22.840 回答
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)
于 2013-10-26T05:32:32.797 回答