【问题标题】:How to find duplicates within each row in R如何在R中的每一行中查找重复项
【发布时间】:2020-03-17 23:08:40
【问题描述】:

如何使用 R 查找在一行中是否存在重复项?

附件是主管报告层次结构的示例。一行中不应该有重复的数字,因为每个人都不能向层次结构中的某个人汇报。

在示例图像中,第 2 行有两个 6,第 3 行有两个 10,所以我想创建一个“重复”列,指示重复的“Y”。欢迎任何其他建议。

“for 循环(for i in 1:nrow)”或“应用”是更好的选择吗?

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    您可以使用ifelse() 制作专栏

    data$duplicate <- ifelse(apply(data, 1, function(row) any(duplicated(row))), "Y", "N")
    

    【讨论】:

    • 谢谢!这是一个简单的解决方案!为什么我们不能使用它呢?应用(测试,1,函数(行)ifelse(任何(重复(行)),“Y”,“N”))
    • 那就更好了!
    【解决方案2】:

    另一个基本 R 选项

    df$dup <- ifelse(rowSums(do.call(rbind,Map(duplicated,data.frame(t(df)))))>0,"Y","N")
    

    这样

    > df
      sup1 sup2 sup3 sup4 sup5 dup
    1    1    2    3    4   20   N
    2    5    6    6    8   22   Y
    3    9   10   11   10   11   Y
    4   13   14   15   16   13   Y
    

    数据

    df <- data.frame(sup1 = c(1,5,9,13),
                     sup2 = c(2,6,10,14),
                     sup3 = c(3,6,11,15),
                     sup4 = c(4,8,10,16),
                     sup5 = c(20,22,11,13))
    

    【讨论】:

      【解决方案3】:

      我们可以通过循环遍历行来检查duplicated,得到一个逻辑向量作为输出,并在转换为二进制后将其更改为“N”、“Y”

      df1$duplicate <- c("N", "Y")[1+ (
                     apply(df1, 1, function(x) any(duplicated(x))))]
      df1$duplicate
      #[1] "N" "Y" "Y" "Y"
      

      或者它可以更紧凑

      df1$duplicate <- c("N", "Y")[1+(apply(df1, 1, anyDuplicated)>0)]
      

      数据

      df1 <- data.frame(Sup1 = c(1, 5, 9, 13), Sup2 = c(2, 6, 10, 14),
          Sup3 = c(3, 6, 11, 15), Sup4 = c(4, 8, 10, 16), Sup5 = c(20, 22, 11, 13))
      

      【讨论】:

        【解决方案4】:

        我们可以使用table 来计算每行中出现的次数,如果任何值重复,则返回"Y"

        df$duplicate <- c("N", "Y")[apply(df, 1, function(x) any(table(x) > 1)) + 1]
        df
        
        #  Sup1 Sup2 Sup3 Sup4 Sup5 duplicate
        #1    1    2    3    4   20         N
        #2    5    6    6    8   22         Y
        #3    9   10   11   10   11         Y
        #4   13   14   15   16   13         Y
        

        【讨论】:

        • 谢谢罗纳克! “+1”有什么作用?
        • @AmandaLow apply 的输出是一个逻辑向量 (TRUE/FALSE)。我们使用 +1 将其分别更改为 2 和 1,然后将其用于子集 "N""Y"
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-19
        • 2021-03-13
        • 1970-01-01
        • 2014-06-29
        • 2017-03-14
        • 2016-11-03
        • 2020-06-10
        相关资源
        最近更新 更多