通过匹配r

时间:2017-12-25 08:11:30

标签: r dataframe merge match

我有两个数据框。

    Var1           Freq
1   Cafeteria      1
2   Department 3   16
3   Lobby(TT)      2


   X__1  Department1  Department2  Department3  Cafeteria  Lobby(TT)  Lobby(Music Band)
1  Joe   0            0            0            0          0          0
2  Oliver0            0            0            0          0          0
3  Jack  0            0            0            0          0          0
4  James 0            0            0            0          0          0

我想要做的是从第二个数据帧中获取第一行,并将第一个数据帧的Freq的值分配给第二个数据帧的第一行,其中第二个数据帧的列名称数据帧与第一个数据帧Var1值相同。

实际上我有4个数据帧,如第一个,每个数据帧对应第二个数据帧的4行。如果我可以将第一个数据帧与第二个数据帧的第一行匹配,我可以为第二个数据帧中的其余行循环使用相同的逻辑。

2 个答案:

答案 0 :(得分:1)

以下是使用base R

的选项
df2[df1$Var1] <- as.list(df1$Freq)
df2
#    X__1 Department1 Department2 Department3 Cafeteria Lobby(TT) Lobby(Music Band)
#1    Joe           0           0          16         1         2                 0
#2 Oliver           0           0          16         1         2                 0
#3   Jack           0           0          16         1         2                 0
#4  James           0           0          16         1         2                 0

如果我们有4个data.frames,比如第一个,即'df1'和相应的数据集,如'df2'。假设数据集集的对象名称是'df1a','df1b','df1c','df1d'和其他数据集的相应集合是'df2a','df2b','df2c',df2d'

Map(function(x, y) {
       y[x[['Var1']] <- as.list(x[['Freq']]
       y}, mget(paste0("df1", letters[1:4])), mget(paste0("df2", letters[1:4])))

最好将对象保留在list而不是全局环境中的多个对象中。

根据评论,有4个类似于第一个的数据集,即'df1'和单个data.frame'df2'。我们需要根据'df1'类型data.frame中的匹配列替换'df2'中的值,以便从该数据集的每个值中填充每一行。

lst <- list(df1a, df1b, df1c, df1d)
for(i in seq_len(nrow(df2))) df2[i, lst[[i]]$Var1] <- lst[[i]]$Freq

答案 1 :(得分:0)

您可以使用dplyr

执行此操作
library(dplyr)
library(tidyr)
dt=data.frame(Var1=c("Cafeteria","Department3","Lobby_TT"),
              Freq=c(1,16,2))%>%
  mutate(Var1=as.character(Var1))

dt1=data.frame(X__1=c("Joe","Oliver","Jack","James"),
               Department1=c(0,0,0,0),
               Department2=c(0,0,0,0),
               Department3=c(0,0,0,0),
               Cafeteria=c(0,0,0,0),
               'Lobby_TT'=c(0,0,0,0),
               'Lobby_Music'=c(0,0,0,0))%>%
  mutate(X__1=as.character(X__1))


dt1%>%
  tidyr::gather(X__1,-value)%>%
  setNames(c("X__1","Var1","value"))%>%
  left_join(dt,by=c("Var1"))%>%
  tidyr::spread(Var1,Freq)

结果:

   X__1 value Cafeteria Department1 Department2 Department3 Lobby_Music Lobby_TT
1   Jack     0         1          NA          NA          16          NA        2
2  James     0         1          NA          NA          16          NA        2
3    Joe     0         1          NA          NA          16          NA        2
4 Oliver     0         1          NA          NA          16          NA        2