如果a大于b如何打印True或False

时间:2018-08-24 01:34:00

标签: r

我在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"
}  

有人可以帮我做错什么吗?

2 个答案:

答案 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

这是带有TRUEFALSE的逻辑向量。正如akrun在评论中建议的那样,此时,您已经准备好分配此向量来创建新列。

现在让我们将上面的行放在any函数中。

any(outpatient_data$AriT<outpatient_data$DST)
# [1] TRUE

输出只是一个元素,TRUEFALSEany函数就是这样做的。它评估向量以查看是否有任何元素为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)

R具有内置的向量化功能,这意味着许多操作自然会应用于向量的每个元素。因此,您可以直接使用<比较AriTDST,它将返回TRUEFALSE的向量。

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创建。