匹配从另一个数据框中选择最大值

时间:2019-07-24 07:01:23

标签: r match

我有两个数据帧v1和V2。我需要将v2的y列添加到数据帧v1,但希望匹配的值最大。例如

v1 <- data.frame(x = c("a1","b2"))
v2 <- data.frame(x = c("a1","a1","b2","b2"), y= c(1,3,4,6))

我正在使用以下行填充v1中的y列。

v1$y <-v2$y[match(v1$x,v2$x)]

其输出如下。

> v1
   x y
1 a1 1
2 b2 4

match根据第一次出现取y,但我需要根据最大次数取y。像下面这样

> v1
   x y
1 a1 3
2 b2 6

6 个答案:

答案 0 :(得分:4)

随着match返回第一个匹配项,您可以order数据,使得第一个匹配项是max匹配项

v2 <- v2[order(v2$x, -v2$y), ]
v1$y <- v2$y[match(v1$x, v2$x)]

v1
#   x y
#1 a1 3
#2 b2 6

答案 1 :(得分:2)

您可以先进行汇总以找到最大值,然后将其与v1匹配。

tt <- aggregate(y ~ x, data=v2, FUN=max)
v1$y <-tt$y[match(v1$x,tt$x)]
v1
#   x y
#1 a1 3
#2 b2 6

答案 2 :(得分:1)

尝试先进行汇总,然后加入(或匹配),

merge(v1, aggregate(y~x, v2, max), by = 'x')

max_v2 <- aggregate(y~x, v2, max)
max_v2$y[match(v1$x, max_v2$x)]

答案 3 :(得分:1)

可能的base解决方案:

new_df<-merge(v1,v2, by="x")
aggregate(.~x, new_df,max)

或使用dplyr

v1 %>% 
   left_join(v2, "x") %>% 
   group_by(x) %>% 
   summarise(y=max(y))
# A tibble: 2 x 2
  x         y
  <fct> <dbl>
1 a1        3
2 b2        6

或另一个base选项:

 aggregate(.~x,v2[v1$x %in% v2$x,],max)
   x y
1 a1 3
2 b2 6

答案 4 :(得分:0)

这是data.table

的解决方案
library("data.table")
v1 <- data.table(x = c("a1","b2"))
v2 <- data.table(x = c("a1","a1","b2","b2"), y= c(1,3,4,6))

v2[, .(y=max(y)), x][v1, on="x"]
# > v2[, .(y=max(y)), x][v1, on="x"]
#     x y
# 1: a1 3
# 2: b2 6

答案 5 :(得分:0)

首先过滤v2以获取最大值,然后进行匹配

library(dplyr)

v1 <- data.frame(x = c("a1","b2"))
v2 <- data.frame(x = c("a1","a1","b2","b2"), y= c(1,3,4,6))

v2.sub <- v2 %>% 
  group_by(x) %>% 
  filter(y==max(y))

v1$y <-v2.sub$y[match(v1$x,v2.sub$x)]