如何对包含相同字符串的行进行两次子集

时间:2019-07-30 13:31:57

标签: r dataframe subset

我有一个如下所示的数据框。

> dput(head(wp_data_ensembl))

structure(list(wpid = c("WP3633", "WP3633", "WP3633", "WP694", 
"WP694", "WP694"), gene = c("ENSG00000156006", "ENSG00000156006", 
"ENSG00000156006", "ENSG00000156006", "ENSG00000156006", "ENSG00000156006"
), wpid = c("WP702", "WP694", "WP3633", "WP702", "WP694", "WP3633"
), name = c("Metapathway biotransformation Phase I and II", "Arylamine metabolism", 
"Caffeine and Theobromine metabolism", "Metapathway biotransformation Phase I and II", 
"Arylamine metabolism", "Caffeine and Theobromine metabolism"
)), row.names = c(NA, 6L), class = "data.frame")

数据框包含两列,均名为wpid。我想子集所有行,其中两列都具有相同的字符串。

例如以下几行中的内容。

   wpid            gene   wpid                                         name
1 WP3633 ENSG00000156006  WP702 Metapathway biotransformation Phase I and II
2 WP3633 ENSG00000156006  WP694                         Arylamine metabolism
3 WP3633 ENSG00000156006 WP3633          Caffeine and Theobromine metabolism

仅第三行应保留在新数据框中。

任何帮助都是最欢迎的。

2 个答案:

答案 0 :(得分:2)

由于列名相同(虽然不建议使用),所以我们可以先使用索引group_by_at,然后再使用filter

library(dplyr)
df1 %>% 
  group_by_at(1:3) %>% 
  slice(n())

如果我们需要filter两个列都相同的所有实例,请将列名更改为unique,因为重复名称在管道中不起作用,只会造成混乱,然后执行filter

df1 %>%
    set_names(make.unique(names(.))) %>% 
    filter(wpid == wpid.1)

答案 1 :(得分:1)

您进行矢量比较。在R中,这是隐式的。自己尝试一下:

wp_data_ensembl[,1] == wp_data_ensembl[,3]
[1] FALSE FALSE TRUE FALSE TRUE FALSE

然后,您可以使用逻辑向量(从上一行返回的对象进行子集设置:

wp_data_ensembl[wp_data_ensembl[,1] == wp_data_ensembl[,3], ]