我正在尝试检查数据框中是否存在特定值。
我知道使用 %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
如何正确地检查一个值是否存在于数据框中?
any(A==1)
#[1] TRUE
使用Reduce
进行OR逻辑运算:
Reduce("|", A==1)
或者
length(which(A==1))>0
或
is.element(1,unlist(A))
要查找该值的位置,您可以执行以下操作:
which(A == 1, arr.ind=TRUE)
# row col
#[1,] 1 1
或者简单地说
sum(A == 1) > 0
#[1] TRUE
any(A == 1)
。 - user3603486使用sapply
循环变量,然后使用any
函数。
any(sapply(A, function(x) 1 %in% x))
[1] TRUE
或者按照digEmAll的评论所说,您可以使用unlist
函数,该函数接受一个列表(数据框)并返回一个向量。
1 %in% unlist(A)
[1] TRUE
理解为何第一次尝试不起作用的关键在于理解数据框是什么——它是等长向量的列表。你所要做的不是检查这个向量列表是否满足条件,而是检查这些向量中的值是否满足条件。
any(A == 1)
返回FALSE或TRUE
1 %in% as.matrix(A)
句子的意思是:如果A的所有列都是数字,那么判断数字1是否在矩阵A中出现。 - digEmAll"1" %in% as.character(as.matrix(A))
可能在所有情况下都有效,但我不知道它有多好。 - d.b