R中向量之间的多个一对多匹配

R中向量之间的多个一对多匹配,r,R,我想用新值表中的值更新数据框,其中数据框和新值表之间存在一对多关系。此代码说明了以下意图: df = data.frame(x=rep(letters[1:4],5,rep=T), y=1:20) 和新的价值观 eds = data.frame(x=c('c','d'), val=c(101, 102)) 对于一对一关系,以下各项应起作用: df$x[match(eds$x, df$x)] = eds$x[match(df$x, eds$x)] 但是match只适用于第一个匹配,因此这会抛

我想用新值表中的值更新数据框,其中数据框和新值表之间存在一对多关系。此代码说明了以下意图:

df = data.frame(x=rep(letters[1:4],5,rep=T), y=1:20)
和新的价值观

eds = data.frame(x=c('c','d'), val=c(101, 102))
对于一对一关系,以下各项应起作用:

df$x[match(eds$x, df$x)] = eds$x[match(df$x, eds$x)]
但是match只适用于第一个匹配,因此这会抛出错误
要替换的项目数不是替换长度的倍数
。非常感谢您提供有关最有效方法的建议。我猜一些
sapply
wrapper,但我想不出方法


提前感谢。

这不是一个非常健壮的解决方案。这取决于您的确切数据结构(重复“c”、“d”模式),但它适用于这种情况:

df[df[["x"]] %in% eds[["x"]], "y"] = eds[[2]]

tmp我不认为这是一个编程问题,您需要一个聚合操作来将一对多问题恢复为一对一问题。还是要复制值?在后一种情况下,您应该尝试
合并
.Hi asb。我只想用
eds
中与之匹配的相应“y”值更新
df
中相关行的“y”值<在%eds[[“x”]]
中,code>df[[“x”]]%(或者就这一点而言,
df$x%in%eds$x
)只返回逻辑向量,而不是匹配的位置。在R中使用
逻辑子集设置
向量回收
是不明智的。啊,我明白了,我必须读懂向量回收!我想我应该回答Josh不那么优雅但更明智的方法,但是谢谢。
tmp  <- eds$val[match(df$x, eds$x)]   # Matching indices (with NAs for no match)
df$y <- ifelse(is.na(tmp), df$y, tmp) # Values at matches (leaving alone for NAs)

head(df, 5)
#   x   y
# 1 a   1
# 2 b   2
# 3 c 101
# 4 d 102
# 5 a   5