使用一列中的逻辑+ NA值进行过滤

时间:2016-10-31 11:23:15

标签: r

我有以下数据框:

df <- data.frame("Logical"=c("true",NA,"false","true","","false"),
             "Numeric"=c(1,2,3,4,5,6))

unique(df$Logical)
length(df$Logical == TRUE)

我想知道我的TRUE列中有多少df$Logical - 值。但似乎我遗漏了一些东西,length(df$Logical == TRUE)在我的逻辑列中没有返回任何记录。

在这种特殊情况下,我做错了什么。对于TRUE - df$Logical列中的值,所需结果应为2。非常感谢提前。

2 个答案:

答案 0 :(得分:0)

我们需要在小写字母中指定字符串,因为值为&#39; true / false&#39;并不完全TRUE/FALSE。另外,应使用length而不是sumsum获取TRUE元素的数量。

sum(df$Logical == "true")
#[1] 2

如果列中有NA元素,请使用na.rm = TRUE

sum(df$Logical=='true', na.rm = TRUE)
#[1] 2

逻辑或任何其他向量的length将与数据集的原始长度/行数相同。

length(df$Logical == "true")
#[1] 6

因为它返回length 6的逻辑向量。

df$Logical == "true"
#[1]  TRUE FALSE FALSE  TRUE FALSE FALSE

要获取truefalse的计数,我们可以使用table

table(df$Logical)

答案 1 :(得分:0)

首先,将“true”和“false”放入数据框中不是布尔语,而是简单的字符串。

此外,length(df$Logical == TRUE)在此示例中将始终返回6,即列中元素的数量。这是因为df$Logical == TRUE返回TRUE或FALSE序列。在你的情况下,它将返回

FALSE    NA FALSE FALSE FALSE FALSE

因为布尔表达式永远不会成立。但是,length()返回的长度为6。

要解决此问题,您可以像这样定义数据框

df <- data.frame("Logical"=c(TRUE,NA,FALSE,FALSE,NA,FALSE),
         "Numeric"=c(1,2,3,4,5,6))

然后你可以总结一下TRUE

的数量
sum(df$Logical == TRUE, na.rm = T)
[1] 2

na.rm = T在此很重要,否则如果还有一个元素NA,则总和将返回NA

或者,您可以使用字符串来表示true或false(以及空字符串NA)

然后你可以写

df <- data.frame("Logical"=c("true",NA,"false","true","","false"),
             "Numeric"=c(1,2,3,4,5,6))

sum(df$Logical == "true", na.rm = T)
[1] 2