我有两个数据帧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
答案 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)]