R子集具有复杂条件的数据帧

时间:2014-07-13 05:23:35

标签: sql r

我有一个名为df1的数据集。它有一个ID列和其他一些列,例如Date(Posixt)PriceSentiment(都是数字)等。

我有两个df1子集,分别是df2df3(可能会有一些重叠)。我想要从df2移除df3df1的所有行(或df1-(df2 U df3)U为union)。

我尝试了子集,但获取select参数真的不容易,因为它不是ID!=100之类的直接条件。

当然,循环必须是解决这个问题的方法,但它需要花费太多时间而且看起来很难看 是否有某种方式可以像矢量或矩阵运算那样快速简洁地实现这一点?

2 个答案:

答案 0 :(得分:1)

您可以改为使用布尔索引。

1。生成数据

data = data.frame(id=1:20,value=rnorm(20))

2。制作两个子集,每行5行

data.1 = data[sample(nrow(data), 5), ]
data.2 = data[sample(nrow(data), 5), ]

3。索引行

要点是只保留子集 ID中的任何非(!运算符)的ID。管道|字符是OR语句 - 如果id在两个子集中的任何一个中,我们就消除了。

data[!(data$id %in% data.1$id | data$id %in% data.2$id),]

答案 1 :(得分:1)

您可以使用[函数直接索引到df1对象而不是使用subset()。我们只需要创建一个具有我们想要的标准的逻辑向量。为此,我们将使用%in%函数和一些否定。这似乎可以解决问题:

df1 <- data.frame(id = 1:10, foo = rnorm(10), bar = runif(10))

#Randomly sample three rows to create df2 and df3
set.seed(2)
df2 <- df1[sample(1:10, 3, FALSE), ]
df3 <- df1[sample(1:10, 3, FALSE), ]

#what IDs are in df2 and df3?
c(df2$id, df3$id)
#--
[1] 2 7 5 2 9 8

#OK, so we want to get id's 1,3,4,6,10
df1[!(df1$id %in% c(df2$id, df3$id)),]
#--
   id        foo       bar
1   1 -0.5656801 0.8613120
3   3  0.1252706 0.5147147
4   4  1.3532248 0.8224739
6   6  0.3225545 0.9746704
10 10  2.1502097 0.9939075