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