我想使用新值表中的值更新数据框,其中数据框和新值表之间存在一对多关系。此代码说明了意图:
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
包装,但我无法想到这种方法。
提前致谢。
答案 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