【问题标题】:How to subset rows that contains the same string twice如何对包含相同字符串的行进行两次子集化
【发布时间】:2019-07-30 13:31:57
【问题描述】:

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

> 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

只有第 3 行应保留在新数据框中。

欢迎任何帮助。

【问题讨论】:

  • 不建议使用相同的列名

标签: r dataframe subset


【解决方案1】:

由于列名相同(但不推荐),我们可以先使用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)

【讨论】:

  • 感谢您的回复。此代码将数据从 336623 行子集到 25122 行。但是第 1 列和第 3 列之间有多个不匹配。我不太清楚它做了什么。
  • 抱歉会更准确。使用 dplyr 代码后仍有许多行包含不匹配的第 1 列和第 3 列中的字符。
【解决方案2】:

您进行矢量比较。在 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], ]

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多