У меня есть два фрейма данных v1 и V2. Мне нужно добавить столбец y из v2 в фрейм данных v1, но я хочу, чтобы совпадающее значение было максимальным. Например
v1 <- data.frame(x = c("a1","b2"))
v2 <- data.frame(x = c("a1","a1","b2","b2"), y= c(1,3,4,6))
Я использую строку ниже для заполнения столбца y в v1.
v1$y <-v2$y[match(v1$x,v2$x)]
который выводит ниже.
> v1
x y
1 a1 1
2 b2 4
match берет y на основе первого вхождения, но мне это нужно на основе макс. что-то вроде ниже
> v1
x y
1 a1 3
2 b2 6





Попробуйте сначала агрегировать, а затем присоединиться (или сопоставить),
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)]
Вы можете сначала агрегировать, чтобы найти максимум, а затем сопоставить его с 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
Вот решение с 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
Возможное 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
Сначала отфильтруйте 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)]
Поскольку 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
Мне не нужно менять мой текущий код с помощью этого решения