Records:-
UniqueID Country Price
AAPL USA 107
AAPL USA 105
GOOG USA 555
GOOG USA 555
VW DEU 320
Mapping:-
UniqueID Country Price
AAPL USA 120
GOOG USA 550
VW DEU 300
我想添加一列Final,并将映射表中的值映射到记录表。对于例如记录表中的所有AAPL条目的最终值应为120.
Output:-
Records:-
UniqueID Country Price Final
AAPL USA 107 120
AAPL USA 105 120
GOOG USA 555 550
GOOG USA 555 550
VW DEU 320 300
我使用了以下代码行: -
Records$Final <- Mapping[which(Records$UniqueID==Mapping$UniqueID),"Price"]
它引发了一个错误,说替换和数据长度不同。同样使用 merge 复制列,我不想这样做。
答案 0 :(得分:2)
我们可以使用inner_join
,
library(dplyr)
inner_join(records, Mapping, by = c('UniqueID', 'Country'))
# UniqueID Country Price.x Price.y
#1 AAPL USA 107 120
#2 AAPL USA 105 120
#3 GOOG USA 555 550
#4 GOOG USA 555 550
#5 VW DEU 320 300
然后按照你的方法,
Records$Final <- Mapping$Price[match(Records$UniqueID, Mapping$UniqueID)]
Records
# UniqueID Country Price Final
#1 AAPL USA 107 120
#2 AAPL USA 105 120
#3 GOOG USA 555 550
#4 GOOG USA 555 550
#5 VW DEU 320 300
答案 1 :(得分:0)
首先,在Mapping表中将列Price重命名为Final
colnames(Mapping)[colnames(Mapping) == "Price"] <- "Final"
然后,使用merge()。你应该得到你想要的东西
答案 2 :(得分:0)
Records=data.frame(UniqueID=c("AAPL","AAPL","GOOG","GOOG","VW"),country=c("USA","USA","USA","USA","DEU"),Price=c(107,105,555,555,320))
Mapping=data.frame(UniqueID=c("AAPL","GOOG","VW"),country=c("USA","USA","DEU"),Price=c(120,550,300))
names(Mapping)[3] <- "Final"
Output <- merge(x=Records,y=Mapping[,c(1,3)],by="UniqueID",all.x=TRUE)