【问题标题】:Keep repeated element once and the entire data frame in r将重复元素保留一次并将整个数据框保留在 r
【发布时间】:2017-01-20 02:44:28
【问题描述】:

我想根据第一列中的重复元素删除行,但也想保留第二列。我可以使用与第二列中重复元素相关的任何值。

输入:

df = data.frame(col1 = c("a", "a", "a", "b", "b", "c"), col2 = 1:6)

预期输出:

col1 col2
a    1
b    4

或者,

col1 col2
    a    2
    b    5

等等

到目前为止,尝试使用以下命令,但没有保留整个数据框:

df[(duplicated(df$col1)),] 

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    使用dplyr,我们可以group_bycol1,然后只包括那些出现多次的组,并使用slice逐组获取第一行

    library(dplyr)
    df %>%
       group_by(col1) %>%
       filter(n() > 1) %>%
       slice(1)
    
    #   col1  col2
    #  <fctr> <int>
    #1   a     1
    #2   b     4
    

    要从每个组中获得第二行,我们只需

    df %>%
      group_by(col1) %>%
      filter(n() > 1) %>%
      slice(2)
    
    #    col1  col2
    #    <fctr> <int>
    #1      a     2
    #2      b     5
    

    我们也可以使用dplyr中的row_number函数

    df %>%
      group_by(col1) %>%
      filter(n() > 1) %>%
      filter(row_number() == 1)
    

    【讨论】:

      【解决方案2】:

      以下应该做你想做的事:

      > df = data.frame(col1 = c("a", "a", "a", "b", "b", "c"), col2 = 1:6)
      > t <- table(df[,1])
      > df[match(names(t[t>1]),df[,1]),]
        col1 col2
      1    a    1
      4    b    4
      

      简短说明:table(...)计算每个元素出现在第一列的次数。 names(t[t&gt;1]) 只选择至少出现两次的那些,match(...) 给出所述元素的(第一个)索引。最后选择这些索引对应的行。

      【讨论】:

      • 谢谢@Jonathan,我也不想要第 6 行。查看我的预期输出。
      • 所以你只想要那些重复两次或更多次的?
      • 是的,完全正确。 @乔纳森
      【解决方案3】:

      我们可以通过data.table 做到这一点。将'data.frame'转换为'data.table'(setDT(df)),按'col1'分组,if行数大于1,获取第一行

      library(data.table)
      setDT(df)[, if(.N>1) head(.SD, 1) , col1]
      #   col1 col2
      #1:    a    1
      #2:    b    4
      

      如果我们需要第二个值

      setDT(df)[, if(.N>1) .SD[2] , col1]
      #   col1 col2
      #1:    a    2
      #2:    b    5
      

      或使用dplyr

      library(dplyr)
      df %>%
         group_by(col1) %>%
         filter(n()>1 & row_number()==1)
      #   col1  col2
      #  <fctr> <int>
      #1      a     1
      #2      b     4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 2022-10-18
        • 2021-12-05
        相关资源
        最近更新 更多