映射数据帧之间的值R.

Vii*_*ama 5 r dataframe

让我们创建示例数据:

df <- data.frame(date=c("2017-01-01","2017-01-02", "2017-01-03", "2017-01-04", "2017-01-05"), X1=c("A", "B", "C", "D", "F"),
                 X2=c("B", "A", "D", "F", "C"))
df2 <- data.frame(date=c("2017-01-01","2017-01-02", "2017-01-03", "2017-01-04", "2017-01-05"), 
                  A=c("3", "4", "2", "1", "5"),
                  B=c("6", "2", "5", "1", "1"),
                  C=c("1", "4", "5", "2", "3"),
                  D=c("67", "67", "63", "61", "62"),
                  F=c("31", "33", "35", "31", "38"))
Run Code Online (Sandbox Code Playgroud)

所以我有两个数据框,我希望按日期和X1和X2匹配df2到df的值,并为这些创建新的变量.这对我来说很棘手的是df2中的匹配值是在colnames中.最终结果应如下所示:

> result
        date X1 X2 Var1 Var2
1 2017-01-01  A  B    3    6
2 2017-01-02  B  A    2    4
3 2017-01-03  C  D    5   63
4 2017-01-04  D  F   61   31
5 2017-01-05  F  C   38    3

result <- data.frame(date=c("2017-01-01","2017-01-02", "2017-01-03", "2017-01-04", "2017-01-05"), 
                     X1=c("A", "B", "C", "D", "F"),
                     X2=c("B", "A", "D", "F", "C"),
                     Var1=c("3", "2", "5", "61", "38"),
                     Var2=c("6", "4", "63", "31", "3"))
Run Code Online (Sandbox Code Playgroud)

我想使用mapvalues,但无法弄明白.第二个想法是使用df2进行长时间格式化(融化),然后尝试,但也失败了.

好的,这是我最好的尝试,只是觉得可以有更有效的方法,如果你必须创建多个(> 50)新变量到数据框架.

df2.long <- melt(df2, id.vars = c("date"))

df$Var1 <- na.omit(merge(df, df2.long, by.x = c("date", "X1"), by.y = c("date", "variable"), all.x = FALSE, all.y = TRUE))[,4]
df$Var2 <- na.omit(merge(df, df2.long, by.x = c("date", "X2"), by.y = c("date", "variable"), all.x = FALSE, all.y = TRUE))[,5]
Run Code Online (Sandbox Code Playgroud)

Cat*_*ath 3

一种可能性mapply

df$Var1 <- mapply(function(day, col) df2[df2$date==day, as.character(col)], 
                  day=df$date, col=df$X1)
df$Var2 <- mapply(function(day, col) df2[df2$date==day, as.character(col)], 
                  day=df$date, col=df$X2)

df
#        date X1 X2 Var1 Var2
#1 2017-01-01  A  B    3    6
#2 2017-01-02  B  A    2    4
#3 2017-01-03  C  D    5   63
#4 2017-01-04  D  F   61   31
#5 2017-01-05  F  C   38    3
Run Code Online (Sandbox Code Playgroud)

注意:
如果您有更多列需要修改(不仅仅是示例中的 2 列),您可以使用lapply循环遍历列X.

df[, paste0("Var", 1:2)] <- lapply(df[,paste0("X", 1:2)], 
                                   function(value) {
                                      mapply(function(day, col) df2[df2$date==day, as.character(col)], 
                                             day=df$date, col=value)})
Run Code Online (Sandbox Code Playgroud)