在R中对行进行子集

时间:2016-02-15 07:33:21

标签: r subset sqldf

我有一个庞大的数据集,格式如下:

 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的数据帧然后使用该数据帧,我们可以使用子集来获取所有行吗?

请帮忙。 谢谢

3 个答案:

答案 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)),]