如何删除重复项但在R

时间:2016-07-18 21:15:04

标签: r dataframe merge

我有以下两个数据框:

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))

我想知道如何合并上面的df,但只保留最近的时间取决于年份。它应该是这样的:

Names  Year   Times
a      12     2
b      12     2
c      16     7
d      16     7
e      13     4

4 个答案:

答案 0 :(得分:5)

我猜你并不是要合并这些,而是​​通过堆叠来组合。您的问题不明确,因为“重复”可能发生在数据帧级别或矢量级别。您的示例不会在数据帧级别显示任何重复,但会在矢量级别显示。描述问题的最佳方式是,如果Times值为names,则需要每个组中的最后一个(或最大)> 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 条目:

nvarchar(100)

答案 1 :(得分: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 :(得分:3)

我们也可以使用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

"name" : "Partner Name",
"features" : [ 
    {
        "val" : "Family",
        "key" : "Type"
    },
    {
        "val" : "Paris",
        "key" : "City"
    }
],
"variants" : [ 
    {
        "name" : "Activity 1 Name",
        "description" : "Quick description",
        "price" : 20
    }
]

答案 3 :(得分: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])。