【问题标题】:Find unique rows [duplicate]查找唯一行[重复]
【发布时间】:2018-01-05 00:38:40
【问题描述】:

这看起来很简单,但我想不通。

给定这个数据框

df=data.frame(
  x = c(12,12,165,165,115,148,148,155,155,521),
  y = c(54,54,122,122,215,108,108,655,655,151)  
)


 df
     x   y
1   12  54
2   12  54
3  165 122
4  165 122
5  115 215
6  148 108
7  148 108
8  155 655
9  155 655
10 521 151

现在,我怎样才能获得只存在一次的行。那是第 5 行和第 10 行。行的顺序可以完全是任意的,因此检查“下一个”行不是一种选择。我尝试了很多东西,但在我的 data.frame 上没有任何效果,它有大约 40k 行。

我有一个解决方案处理我的 data.frame 的子集(约 1k 行),需要 3 分钟才能处理。因此,我的解决方案在我的原始 data.frame 上需要 120 分钟,这是不合适的。有人可以帮忙吗?

【问题讨论】:

标签: r dataframe duplicates unique


【解决方案1】:

从数据框的开头和结尾检查duplicated,如果没有返回true,则选择它:

df[!(duplicated(df) | duplicated(df, fromLast = TRUE)),]

#     x   y
#5  115 215
#10 521 151

【讨论】:

    【解决方案2】:

    table的解决方案

    library(dplyr)
    table(df) %>% as.data.frame %>% subset(Freq ==1) %>% select(-3)
    

    或者像你在 cmets 中所说的那样,你不想加载包:

    subset(as.data.frame(table(df)),Freq ==1)[,-3]
    

    另外我认为data.table 对于大数据集和过滤来说非常快,所以正如你提到的速度,这可能也值得一试:

    df2 <- copy(df)
    df2 <- setDT(df2)[, COUNT := .N, by='x,y'][COUNT ==1][,c("x","y")]
    

    【讨论】:

    • filter,不是subset,对吧?
    • 除了subset 保留初始行号这一事实之外,我从来没有完全理解过区别。 filter也可以被其他包屏蔽,所以我一般使用subset。不好吗?
    • 不,一点也不。我只是以为你打算这样做 dplyr 风格。
    • 为什么 subset 不是 dplyr 风格 :) ?你的意思是它的基本功能?
    • 这是相关的,简而言之,过滤器丢弃行名称对于较大的数据集更快(对于较小的数据集更慢),并且更好地使用 sql 数据库:stackoverflow.com/questions/39882463/…
    【解决方案3】:

    使用dplyr 的解决方案。 df2 是最终输出。

    library(dplyr)
    df2 <- df %>%
      count(x, y) %>%
      filter(n == 1) %>%
      select(-n)
    

    【讨论】:

    • 感谢您的回答。不需要另一个库是一个好处,因为它在我们开发的包中使用。
    【解决方案4】:

    另一个基本 R 解决方案使用ave 计算每行的总出现次数,并仅对出现在1 时间的那些进行子集。也可以修改它以对出现特定次数的行进行子集化。

    df[ave(1:NROW(df), df, FUN = length) == 1,]
    #     x   y
    #5  115 215
    #10 521 151
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2020-05-11
      • 2016-11-03
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多