获取Dataframe的元素数等于List-R中的元素

时间:2014-07-03 16:06:43

标签: r comparison

我有一个具有以下结构的数据框:

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数组成员的所有水果数据的更好方法?

2 个答案:

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

至于为什么==不起作用,您必须明白==FruitkeepFruit进行元素明智的比较,即它比较每个向量的第一个元素是否相等,然后是每个向量的第二个元素,依此类推。现在keepFruitFruit的长度不同,因此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