【问题标题】:How to compare duplicated values and filter out unwanted ones in a R data frame? [duplicate]如何比较重复值并过滤掉 R 数据框中不需要的值? [复制]
【发布时间】:2020-04-17 07:03:23
【问题描述】:

我制作了一个这样的测试数据框:

gene <- as.factor(c('A','B','B','B','C','C','D'))
location <- as.integer(c(1,4,5,6,2,3,9))
df <- data.frame(gene, location)

> df
  gene location
1    A        1
2    B        4
3    B        5
4    B        6
5    C        2
6    C        3
7    D        9

我想保留唯一的基因 A、B、C、D,并过滤掉非最高位置的重复基因。 (例如对于基因B,只保留位置6的B;对于基因C,只保留位置3的C)。

所以最终结果应该是这样的:

  gene location
1    A        1
4    B        6
6    C        3
7    D        9

有人知道我该怎么做吗?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您可以使用aggregate()ave() 来执行此操作,即,

    dfout <- aggregate(location ~ gene, df, FUN = max)
    

    dfout <- unique(within(df,location <- ave(location,gene,FUN = max)))
    

    这样

    > dfout
      gene location
    1    A        1
    2    B        6
    3    C        3
    4    D        9
    

    【讨论】:

    • 我想知道如果我有一个不只是两列的更大数据框,我应该在这里指定“~基因”吗?
    • @Helena 然后你可以使用dfout &lt;- aggregate(. ~ gene, df, FUN = max)
    【解决方案2】:

    如果你有一个数据框包含的不仅仅是基因和位置,你可以试试:

    df = df[order(df$gene,-df$location),]
    df[!duplicated(df$gene),]
    

    【讨论】:

    • 似乎它不适用于更大的数据集,但我通过添加一行来修复它:df &lt;- df[order(-df$location),]index &lt;- duplicated(df$gene)df &lt;- df[!index,] 虽然它看起来与您的建议相同。跨度>
    • 是的。只需执行 df = df[order(-df$location); df
    • 您的示例数据框很小,所以我只是展示了上面的解决方案,因为对两列进行排序并不昂贵。在您的问题中说明这一点很有用。
    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2023-03-26
    • 2018-01-07
    相关资源
    最近更新 更多