【问题标题】:Find rows that contain the same values across two or three columns在两列或三列中查找包含相同值的行
【发布时间】:2021-04-10 14:25:01
【问题描述】:

我想在两列或三列中查找包含相同值的行。这是一个示例数据集:

replicate(3, {sample(1:3)})
     [,1] [,2] [,3]
[1,]    3    3    2
[2,]    2    1    1
[3,]    1    2    3

对于此数据集,第一行和第二行具有重复值(即 3 和 1),因此我想提取并处理它们,然后只保留具有非重复值的行(即第三行在这种情况下)。

如何做到这一点?我有一个更大的数据集。感谢您的帮助!

【问题讨论】:

    标签: r data-manipulation data-extraction


    【解决方案1】:

    在最后的注释中使用 m,将 anyDuplicated 应用于每一行并使用它来对行进行子集化。如果没有重复项,则 anyDupolicated 返回 0,否则返回第一个重复项的索引。感叹号 (!) 会将 0 强制为 FALSE,其他值强制为 TRUE,然后将其取反。

    m[!apply(m, 1, anyDuplicated),, drop = FALSE ]
    ##      [,1] [,2] [,3]
    ## [1,]    1    2    3
    

    subset(m, !apply(m, 1, anyDuplicated))
    ##      [,1] [,2] [,3]
    ## [1,]    1    2    3
    

    注意

    这与问题中显示的矩阵相同,但生成时没有使用随机数来实现重现性。

    m <- matrix(c(3, 2, 1, 3, 1, 2, 2, 1, 3), 3)
    

    【讨论】:

    • 先生。格洛腾迪克很高兴再次在这里见到您。
    • 很好的解决方案!谢谢! @G。格洛腾迪克
    【解决方案2】:

    给你

    dataf<- replicate(3, {sample(1:3)})
    
    dup_rows<-apply(dataf,1,FUN=function(x) ifelse( max(table(x) )>1 ,TRUE, FALSE) )
    
    data_non_dup<-dataf[!dup_rows,]
    

    【讨论】:

    • 谢谢你!
    【解决方案3】:

    如果您有兴趣,这里有一个 tidyverse 解决方案:

    library(dplyr)
    library(purrr)
    
         [,1] [,2] [,3]
    [1,]    1    3    2
    [2,]    3    1    3
    [3,]    2    2    1
    
    
    df %>%
      as_tibble() %>%
      mutate(dup = pmap_dbl(list(V1, V2, V3), ~ n_distinct(c(...)))) %>%
      filter(dup == 3) %>%
      select(-dup)
    
    
    # A tibble: 1 x 3
         V1    V2    V3
      <int> <int> <int>
    1     1     3     2
    
    

    【讨论】:

    • 由于每次我们运行矩阵都会生成一个样本,所以每个人的矩阵可能有不同的行值,除非我们使用set.seed
    • 我的荣幸。很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多