如何在R中删除重复数据但保留最近的数据

3

我有以下两个数据框:

df1 = data.frame(names=c('a','b','c','c','d'),year=c(11,12,13,14,15), Times=c(1,1,3,5,6))
df2 = data.frame(names=c('a','e','e','c','c','d'),year=c(12,12,13,15,16,16), Times=c(2,2,4,6,7,7))

我想知道如何合并上述数据框,但只保留最近的时间,具体取决于年份。应该是这样的:
Names  Year   Times
a      12     2
b      12     2
c      16     7
d      16     7
e      13     4
4个回答

5

我猜测你的意思不是合并这些数据,而是通过堆叠数据进行组合。你的问题存在歧义,因为“重复”可能发生在数据帧级别或向量级别。你的示例没有显示任何数据帧级别上的重复,但在向量级别上有重复。描述这个问题的最佳方法是,如果names值相同,则想要每个组中的最后一个(或最大)Times条目:

> df1
  names year Times
1     a   11     1
2     b   12     1
3     c   13     3
4     c   14     5
5     d   15     6
> df2
  names year Times
1     a   12     2
2     e   12     2
3     e   13     4
4     c   15     6
5     c   16     7
6     d   16     7
> dfr <- rbind(df1,df2)
> dfr <-dfr[order(dfr$Times),]
> dfr[!duplicated(dfr, fromLast=TRUE) , ]
   names year Times
1      a   11     1
2      b   12     1
6      a   12     2
7      e   12     2
3      c   13     3
8      e   13     4
4      c   14     5
5      d   15     6
9      c   15     6
10     c   16     7
11     d   16     7

> dfr[!duplicated(dfr$names, fromLast=TRUE) , ]
   names year Times
2      b   12     1
6      a   12     2
8      e   13     4
10     c   16     7
11     d   16     7

4

这里使用了基础的 R 函数; 也有一些新的包(例如 plyr)被认为让分割-应用-组合过程更加直观。

df <- rbind(df1,  df2)
do.call(rbind, lapply(split(df, df$names), function(x) x[which.max(x$year), ]))

##   names year Times
## a     a   12     2
## b     b   12     1
## c     c   16     7
## d     d   16     7
## e     e   13     4

2
split+lapply=by - do.call(rbind,by(df, df$names, function(x) x[which.max(x$year), ])) - thelatemail

3
我们也可以使用aggregate
df <- rbind(df1,df2)
aggregate(cbind(df$year,df$Times)~df$names,df,max)

  # df$names V1 V2
# 1        a 12  2
# 2        b 12  1
# 3        c 16  7
# 4        d 16  7
# 5        e 13  4

2
使用公式接口时,您不需要在引用df的时候保持它的存在。这意味着您可以进行以下操作 - aggregate(cbind(year,Times) ~ names, data=rbind(df1,df2), FUN=max) - thelatemail

1
如果你想看一个 data.table 的解决方案,
# load library
library(data.table)
# bind by row and convert to data.table (by reference)
df <- setDT(rbind(df1, df2))
# get the result
df[order(names, year), .SD[.N], by=.(names)]

输出如下:
   names year Times
1:     a   12     2
2:     b   12     1
3:     c   16     7
4:     d   16     7
5:     e   13     4

最后一行代码按照姓名和年份对行绑定的数据进行排序,然后选择每个姓名的最后一个观测值(.sd[.N])。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接