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,其中包含名为 ID、Interaction[=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,]
我有一个庞大的数据集,格式如下:
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,其中包含名为 ID、Interaction[=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,]