我有一个庞大的数据集,格式如下:
ID Interaction Interaction_number
1 abc 1
1 xyz 2
1 pqr 3
1 ced 0
2 ab 0
2 efg 1
3 asdf 2
3 fgh 3
3 abc 0
4 sql 1
4 ghj 2
5 poi 2
6 pqr 1
现在我想提取有interaction_number为0的所有ID数据,例如:
ID Interaction Interaction_number
1 abc 1
1 xyz 2
1 pqr 3
1 ced 0
2 ab 0
2 efg 1
3 asdf 2
3 fgh 3
3 abc 0
它是一个巨大的数据集。我需要使用R。
来提取它我尝试使用sqldf函数。
x<-sqldf("select * from data where data$ID in (select data$ID from data where data$Interaction_number ==0)")
但是这个功能没有用。我想要添加一个标记列(对于所有ID,其中有interaction_number 0),然后将这些行子集化。但我无法弄明白该怎么做。 我们可以创建ID的数据帧然后使用该数据帧,我们可以使用子集来获取所有行吗?
请帮忙。 谢谢
答案 0 :(得分:3)
使用此
sqldf("SELECT * FROM data WHERE ID IN (SELECT ID FROM data WHERE Interaction_number=0)")
您的测试中不需要double等于,并且不要使用data$ID
等来引用SQL表达式中的数据列(您可以使用data.ID
但不必使用在这种情况下的数据框名称。)
在使用此函数之前阅读SQL可能会有所帮助。请记住,它将使用与数据框相同的名称将所有引用的数据框转换为表,并将所有列转换为使用与列相同名称的字段。因此,在这种情况下,我们使用名为 ID , Interaction 和 Interaction_number 的字段查询名为 data 的表。
答案 1 :(得分:3)
我建议使用data.table
包。然后你可以获得你的结果。假设您的数据位于data.frame
df
。然后
library(data.table)
dt <- data.table(df, key = 'ID')
tmp <- dt[, list(condition = any(Interaction_number == 0)), by = ID]
res <- dt[tmp[condition == TRUE, list(ID)]]
答案 2 :(得分:3)
我们可以使用IMyRepository2
执行此操作。按“ID”分组“数据”,如果“Interaction_number”中有dplyr
0个值,则将filter
分组。
any
或使用library(dplyr)
df1 %>%
group_by(ID) %>%
filter(any(!Interaction_number))
# ID Interaction Interaction_number
# (int) (chr) (int)
#1 1 abc 1
#2 1 xyz 2
#3 1 pqr 3
#4 1 ced 0
#5 2 ab 0
#6 2 efg 1
#7 3 asdf 2
#8 3 fgh 3
#9 3 abc 0
ave
base R
或者这可以在没有任何小组的情况下完成
df1[with(df1, ave(!Interaction_number, ID, FUN=any)),]