我有一个具有以下结构的数据框:
DataFrame$Fruit
Apple
Banana
Apple
Mango
Banana
等
我想使用数据(例如计算数字,但也做其他操作),在某些给定的数组中,Fruits是相同的:
keepFruit = c('Apple', 'Banana')
以下表达式:Dataframe$Fruit[which(Dataframe$Fruit == 'Apple' | Dataframe$Fruit == 'Banana')]
返回正确数量的元素,但是下面的表达式给出了错误的数字:Dataframe$Fruit[which(Dataframe$Fruit == keepFruit)]
我理解第二个表达式是将数组与单个文本条目进行比较,但是为什么它仍然会返回一些正确的结果(返回水果匹配的元素)虽然不是相同的数字(即不是全部)?什么是获取keepFruit
数组成员的所有水果数据的更好方法?
答案 0 :(得分:4)
您需要%in%
,而不是==
。这是一个例子:
df <- data.frame(Fruit = c("Apple","Banana","Apple","Mango","Banana"))
keepFruit = c('Apple', 'Banana')
ind <- with(df, Fruit %in% keepFruit)
df[ind, , drop = FALSE]
给予
> df[ind, , drop = FALSE]
Fruit
1 Apple
2 Banana
3 Apple
5 Banana
至于为什么==
不起作用,您必须明白==
对Fruit
和keepFruit
进行元素明智的比较,即它比较每个向量的第一个元素是否相等,然后是每个向量的第二个元素,依此类推。现在keepFruit
与Fruit
的长度不同,因此R 回收 keepFruit
的元素以匹配Fruit
的长度,更长这两个载体。好像R已经完成了
with(df, Fruit == rep(keepFruit, length = length(Fruit)))
或
keepFruit2 <- with(df, rep(keepFruit, length = length(Fruit)))
with(df, Fruit == keepFruit2)
rm(keepFruit2)
两者都返回(这不是你想要的,但就R的规则来说是正确的)
> with(df, Fruit == rep(keepFruit, length = length(Fruit)))
[1] TRUE TRUE TRUE FALSE FALSE
R确实比这更多一点,因为它警告你,较长的向量Fruit
的长度不是较短向量keepFruit
的长度的倍数 - 这几乎总是表明一个问题,因此警告:
> with(df, Fruit == keepFruit)
[1] TRUE TRUE TRUE FALSE FALSE
Warning messages:
1: In is.na(e1) | is.na(e2) :
longer object length is not a multiple of shorter object length
2: In `==.default`(Fruit, keepFruit) :
longer object length is not a multiple of shorter object length
为了更详细地了解会发生什么,我们可以使用与df
进行比较时使用的值和结果来增加==
df2 <- within(df, {
Keep <- rep(keepFruit, length = length(Fruit))
Result <- Fruit == Keep
})
df2
> df2
Fruit Result Keep
1 Apple TRUE Apple
2 Banana TRUE Banana
3 Apple TRUE Apple
4 Mango FALSE Banana
5 Banana FALSE Apple
现在你应该能够看到为什么你得到了==
所做的结果以及为什么它出错了。
答案 1 :(得分:1)
您还可以Vectorize
Vectorize(function(x) df$Fruit==x)(keepFruit) #which gives the logical index of matching positions
Apple Banana
#[1,] TRUE FALSE
#[2,] FALSE TRUE
#[3,] TRUE FALSE
#[4,] FALSE FALSE
#[5,] FALSE TRUE