我有一个名为df1
的数据集。它有一个ID
列和其他一些列,例如Date(Posixt)
,Price
,Sentiment
(都是数字)等。
我有两个df1
子集,分别是df2
和df3
(可能会有一些重叠)。我想要从df2
移除df3
和df1
的所有行(或df1-(df2 U df3)
,U
为union)。
我尝试了子集,但获取select
参数真的不容易,因为它不是ID!=100
之类的直接条件。
当然,循环必须是解决这个问题的方法,但它需要花费太多时间而且看起来很难看 是否有某种方式可以像矢量或矩阵运算那样快速简洁地实现这一点?
答案 0 :(得分:1)
您可以改为使用布尔索引。
data = data.frame(id=1:20,value=rnorm(20))
data.1 = data[sample(nrow(data), 5), ]
data.2 = data[sample(nrow(data), 5), ]
要点是只保留子集 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