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

时间:2014-06-17 14:29:57

标签: 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)]

但匹配仅适用于第一个匹配,因此会引发错误number of items to replace is not a multiple of replacement length。感谢有关最有效方法的任何提示。我猜测了一些sapply包装,但我无法想到这种方法。

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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