在R中的数据帧之间映射值

时间:2016-05-12 13:58:29

标签: r dataframe

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 复制列,我不想这样做。

3 个答案:

答案 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)