检查数值是否在数据框中。

16

我正在尝试检查数据框中是否存在特定值。

我知道使用 %in% 运算符应该可以做到这一点,但当应用于整个数据框时,它似乎不像我所期望的那样工作:

A = data.frame(B=c(1,2,3,4), C=c(5,6,7,8))
1 %in% A

[1] FALSE
但是如果我将其应用于特定列中的值,它会按照我期望的方式工作:

但是如果我将其应用于特定列中的值,它会按照我期望的方式工作:

1 %in% A$C

[1] TRUE

如何正确地检查一个值是否存在于数据框中?


4
1 %in% as.matrix(A) 句子的意思是:如果A的所有列都是数字,那么判断数字1是否在矩阵A中出现。 - digEmAll
@digEmAll,"1" %in% as.character(as.matrix(A)) 可能在所有情况下都有效,但我不知道它有多好。 - d.b
6个回答

25
你可以这样做:
any(A==1)
#[1] TRUE

使用Reduce进行OR逻辑运算:

Reduce("|", A==1)

或者

length(which(A==1))>0

is.element(1,unlist(A))

2
尽管所有这些都能工作,但只有第一个清楚地说明了代码的作用。 - user3603486

10

要查找该值的位置,您可以执行以下操作:

which(A == 1, arr.ind=TRUE)
#     row col
#[1,]   1   1

8

或者简单地说

sum(A == 1) > 0
#[1] TRUE

2
更清晰的写法是 any(A == 1) - user3603486

6

使用sapply循环变量,然后使用any函数。

any(sapply(A, function(x) 1 %in% x))
[1] TRUE

或者按照digEmAll的评论所说,您可以使用unlist函数,该函数接受一个列表(数据框)并返回一个向量。

1 %in% unlist(A)
[1] TRUE

3

理解为何第一次尝试不起作用的关键在于理解数据框是什么——它是等长向量的列表。你所要做的不是检查这个向量列表是否满足条件,而是检查这些向量中的值是否满足条件。


1
尝试:

any(A == 1)

返回FALSE或TRUE


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接