我在R中有数据,如果DST大于另一列中的AriT,我想打印True。 这是我所拥有的数据的一部分
AriT DST
1516 1450
1150 1518
1502 1519
1343 1210
下面的查询是我到目前为止所获得的,但是有些查询如何将它们打印为TRUE。
outpatient_data["check"] <- if(any(outpatient_data$AriT<outpatient_data$DST)) {
"TRUE"
} else {
"FALSE"
}
有人可以帮我做错什么吗?
答案 0 :(得分:2)
我将逐步解释这里发生的事情。
首先,让我们重新创建示例数据框。
outpatient_data <- read.table(text = "AriT DST
1516 1450
1150 1518
1502 1519
1343 1210",
header = TRUE, stringsAsFactors = FALSE)
现在,让我们在控制台中输入outpatient_data$AriT < outpatient_data$DST
。您将看到R打印以下内容。
outpatient_data$AriT < outpatient_data$DST
# [1] FALSE TRUE TRUE FALSE
这是带有TRUE
或FALSE
的逻辑向量。正如akrun在评论中建议的那样,此时,您已经准备好分配此向量来创建新列。
现在让我们将上面的行放在any
函数中。
any(outpatient_data$AriT<outpatient_data$DST)
# [1] TRUE
输出只是一个元素,TRUE
或FALSE
。 any
函数就是这样做的。它评估向量以查看是否有任何元素为TRUE
。由于outpatient_data$AriT<outpatient_data$DST
的输出为FALSE TRUE TRUE FALSE
,因此输出为TRUE
。
最后,让我们看一下整个代码。
outpatient_data["check"] <- if(any(outpatient_data$AriT<outpatient_data$DST)) {
"TRUE"
} else {
"FALSE"
}
由于if
条件内的内容是any(outpatient_data$AriT<outpatient_data$DST)
,即TRUE
,因此此if-else
语句将始终转到第一个块,该块返回字符{{1 }}。然后,将此字符分配给新列"TRUE"
。此外,由于此字符的长度为一,而数据帧的行号大于一,则该字符将被回收。这就是为什么您将获得一列全部包含字符"check"
的原因。
最后的笔记。在R中,"TRUE"
或TRUE
是逻辑条件的保留字。在您的代码中,您尝试分配字符FALSE
或"TRUE"
。这不仅使您困惑,也使其他读者感到困惑。除非您确实需要字符"FALSE"
或"TRUE"
,否则请避免这种情况。
答案 1 :(得分:1)
<
比较AriT
和DST
,它将返回TRUE
和FALSE
的向量。
outpatient_data <- data.frame(
AriT = c(1516, 1150, 1502, 1343),
DST = c(1450, 1518, 1519, 1210)
)
outpatient_data["check"] <- outpatient_data$AriT < outpatient_data$DST
outpatient_data
#> AriT DST check
#> 1 1516 1450 FALSE
#> 2 1150 1518 TRUE
#> 3 1502 1519 TRUE
#> 4 1343 1210 FALSE
您的代码正在返回所有TRUE
,因为您使用了any
,该方法将向量作为输入,如果 any 的值为true,则返回TRUE
。它还将回收该值以填充数据帧的整个长度,这就是为什么它会产生所有TRUE
而不是下面的值的原因。
any(outpatient_data$check)
#> [1] TRUE
由reprex package(v0.2.0)于2018-08-23创建。