【问题标题】:delete rows for duplicate variable in R删除R中重复变量的行
【发布时间】:2014-04-04 17:52:15
【问题描述】:

我有重复年份的面板数据,但我想删除作业值较小的行:

id  name    year    job
1   Jane    1990    100
1   Jane    1992    200
1   Jane    1993    300
1   Jane    1993    1
1   Jane    1997    400
1   Jane    1997    2
2   Tom     1990    400
2   Tom     1992    500
2   Tom     1993    700
2   Tom     1993    1
2   Tom     1997    900
2   Tom     1997    3

我想要以下内容:

id  name    year    job
1   Jane    1990    100
1   Jane    1992    200
1   Jane    1993    1
1   Jane    1997    2
2   Tom     1990    400
2   Tom     1992    500
2   Tom     1993    1
2   Tom     1997    3

有没有办法做到这一点?

【问题讨论】:

标签: r duplicates


【解决方案1】:

你有不同的可能性,例如 plyr 和 dplyr :

# plyr
ddply(tab, .(id, name, year), summarise, job=min(job))
# dplyr
tabg <- group_by(tab, id, name, year)
summarise(tabg, job=min(job))
# basic fonction
aggregate(tab[,"job", drop=FALSE], tab[,3:1], min)

【讨论】:

    【解决方案2】:

    您可以为此使用ddply

    x <- read.table(textConnection("id  name    year    job
     1   Jane    1990    100
     1   Jane    1992    200
     1   Jane    1993    300
     1   Jane    1993    1
     1   Jane    1997    400
     1   Jane    1997    2
     2   Tom     1990    400
     2   Tom     1992    500
     2   Tom     1993    700
     2   Tom     1993    1
     2   Tom     1997    900
     2   Tom     1997    3"),header=T)
    
    library(plyr)
    ddply(x,c("id","name","year"),summarise, job=max(job))
      id name year job
    1  1 Jane 1990 100
    2  1 Jane 1992 200
    3  1 Jane 1993 300
    4  1 Jane 1997 400
    5  2  Tom 1990 400
    6  2  Tom 1992 500
    7  2  Tom 1993 700
    8  2  Tom 1997 900
    

    请注意,我已获得您在说明中要求的内容。您的示例输出与此相矛盾。如果您确实想要示例输出,请使用 min 而不是 max

    【讨论】:

      【解决方案3】:

      如果你的数据是数据框df

      library(data.table)
      
      dt <- as.data.table(df)
      dt[, .SD[which.min(job)], by = list(id, name, year)]
      

      【讨论】:

        【解决方案4】:

        您可以按照 James 的建议将 base R 与函数 order 一起使用:

        > tab[order(tab$job),][! duplicated(tab[order(tab$job), c('id', 'year')], fromLast=T), ]
           id name year job
        1   1 Jane 1990 100
        2   1 Jane 1992 200
        3   1 Jane 1993 300
        5   1 Jane 1997 400
        7   2  Tom 1990 400
        8   2  Tom 1992 500
        9   2  Tom 1993 700
        11  2  Tom 1997 900
        

        【讨论】:

          猜你喜欢
          • 2019-06-22
          • 1970-01-01
          • 1970-01-01
          • 2016-05-17
          • 1970-01-01
          • 2015-01-19
          • 2019-03-29
          • 2017-01-31
          • 2020-10-08
          相关资源
          最近更新 更多