【问题标题】:Subsetting rows in RR中的子集行
【发布时间】:2016-02-15 16:29:10
【问题描述】:

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

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

但该功能不起作用。我正在寻找添加一个标记列( 1 用于所有有interaction_number 0 的ID),然后对这些行进行子集化。但我无法弄清楚该怎么做。 我们可以创建 ID 的数据框,然后使用该数据框,我们可以使用子集来获取所有行吗?

请帮忙。 谢谢你

【问题讨论】:

  • 您的示例中没有等于 0 的 Interaction。你的意思是Interaction_number。如果是这样,你的输出就不清楚了。
  • 是的,对不起,我的意思是 Interaction_number
  • 我基本上想要各个 ID 的所有行,其中有一个 0 Interaction_number
  • 检查 sqldf 函数,它会给你我需要的基本输出。
  • 它实际上是非常简单的 R 子集:df[df$ID %in% df$ID[df$Interaction_number == 0],]

标签: r subset sqldf


【解决方案1】:

我建议使用data.table 包。然后你可以得到你的结果。假设您的数据位于data.framedf。那么

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

【讨论】:

  • 我相信df[ID %in% df[Interaction_number == 0, ID]]会比by-group操作更有效率
【解决方案2】:

使用这个

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

您的测试中不需要双等号,也不要使用data$ID等来引用SQL表达式中的数据列(您可以使用data.ID,但在本例)。

在大量使用此功能之前阅读 SQL 可能会有所帮助。请记住,它将所有引用的数据框转换为与数据框同名的表,并将所有列转换为与列同名的字段。因此,在这种情况下,我们正在查询一个名为 data 的表,其中包含名为 IDInteractionInteraction_number 的字段。

【讨论】:

  • 我已经使用了这个,正如我在问题中提到的并得到了以下错误:sqliteSendQuery(con,statement,bind.data)中的错误:语句中的错误:没有这样的列:data$ID
  • 什么错误?您只说“该功能不起作用”。它以什么方式不起作用。以上对我来说非常有效。确保您使用了我所做的表达方式 - 它与您的不同。
  • @BitanshuDas 看看我的命令和你的不一样,注意我没有用data$ID,只有ID。这就是错误的来源。
  • 谢谢@Matthew。当我们排除 $ 表名部分时,它确实有效。
【解决方案3】:

我们可以通过dplyr 做到这一点。如果 'Interaction_number' 中有 any 0 个值,则按 'ID' 分组 'data' 和 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 Rave

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2019-09-26
    相关资源
    最近更新 更多