【问题标题】:Collapse duplicate rows by median value in R按R中的中值折叠重复行
【发布时间】:2015-07-03 14:48:56
【问题描述】:

我有一个包含两列的日期框架。我想删除第一列中有重复条目的行。但是我想根据第二列的值选择要保留的特定行。

具体来说 - 如果第 1 列中有 2 个重复条目,我希望删除第 2 列中具有较低值的行

或者,如果第 1 列中有超过 2 个相同的条目,那么我希望保留第 2 行中具有中值的行。

所以对于数据框

a <- c(rep("A", 3), rep("B", 3), rep("C",1), rep("D",1), rep("D",1))
b <- c(1,2,3,4,5,6,4,7,6)
df <-data.frame(a,b)

会变成

a <- c(rep("A", 1), rep("B", 1), rep("C",1), rep("D",1))
b <- c(2,5,4,7)
df <-data.frame(a,b)

我已经尝试过 unique() 和 duplicated() 函数,但似乎找不到符合这些条件的参数。非常感谢任何帮助。

【问题讨论】:

  • 对于base R,你也可以看看?aggregate

标签: r


【解决方案1】:

你可以试试

library(data.table)
setDT(df)[, list(b=if(.N==2) min(b) else median(b)) , by = a]
#   a b
#1: A 2
#2: B 5
#3: C 4
#4: D 6

aggregate 的类似选项

aggregate(b~a, df, FUN=function(x) if(length(x)==2) min(x) else median(x))
#  a b
#1 A 2
#2 B 5
#3 C 4
#4 D 6

或者

library(sqldf)
sqldf('select a, 
        case
          when count(b) is 2 then min(b)
          else median(b)
         end b 
       from df
       group by a')
 #  a b
 #1 A 2
 #2 B 5
 #3 C 4
 #4 D 6

根据显示的预期输出,最后一行是D 7,所以如果我们在组长度为2时选择第一个观察,

 setDT(df)[, list(b=if(.N==2) b[1L] else median(b)) , by = a]
 #   a b
 #1: A 2
 #2: B 5
 #3: C 4
 #4: D 7

或者

 aggregate(b~a, df, FUN=function(x) if(length(x)==2) x[1L] else median(x))
 #  a b
 #1 A 2
 #2 B 5
 #3 C 4
 #4 D 7

或者

 sqldf('select a,
           case 
             when count(b) is 2 and min(rowid) then b
             else median(b)
           end b
         from df
       group by a')
 #  a b
 #1 A 2
 #2 B 5
 #3 C 4
 #4 D 7

EDIT 在我看到@eipi10 的帖子后将第一个观察结果更改为min。没有正确阅读 OP 的帖子,并且 OP 的预期输出与描述不符。

【讨论】:

    【解决方案2】:

    使用dplyr

    library(dplyr)
    
    df %>% group_by(a) %>%
      summarise(b = ifelse(n() == 2, min(b), median(b)))
    
      a b
    1 A 2
    2 B 5
    3 C 4
    4 D 6
    

    在您的问题中,您说您想要“较低”的值,以防有两行,这将给出 D=6,而不是 D=7。如果您的意思是出现在数据框中的第一行,您可以这样做:

    df %>% group_by(a) %>%
      summarise(b = ifelse(n() == 2, b[1], median(b)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多