R 中的子集行

Subsetting rows in R

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

 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的ID数据作为0。例如:

 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)")

但是这个功能没有用。我想添加一个标记列(1 代表所有有 interaction_number 0 的 ID),然后对这些行进行子集化。但我不知道该怎么做。 我们可以创建 ID 的数据框,然后使用该数据框,我们可以使用子集获取所有行吗?

请帮忙。 谢谢

使用这个

sqldf("SELECT * FROM data WHERE ID IN (SELECT ID FROM data WHERE Interaction_number=0)")

您的测试中不需要双等号,也不要使用 data$ID 等来引用 SQL 表达式中的数据列(您可以使用 data.ID但在这种情况下没有必要使用数据框名称。

在大量使用此功能之前,先阅读 SQL 可能会有所帮助。请记住,它将做的是将所有引用的数据帧转换为使用与数据帧相同名称的 tables,并将所有列转换为使用与列相同名称的字段。因此,在这种情况下,我们正在查询名为 data 的 table,其中包含名为 IDInteraction[=23] 的字段=], 和 Interaction_number.

我建议使用 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)]]

我们可以用 dplyr 做到这一点。将 'data' 按 'ID' 分组,如果 'Interaction_number'.

中有 any 0 个值,则 filter
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

或使用 base R

中的 ave
df1[with(df1, ave(!Interaction_number, ID, FUN=any)),]

或者这可以在没有任何分组的情况下完成

df1[df1$ID %in%subset(df1, !Interaction_number)$ID,]