我有以下两个数据框:
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
答案 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]
)。