我有两个数据框。
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行。如果我可以将第一个数据帧与第二个数据帧的第一行匹配,我可以为第二个数据帧中的其余行循环使用相同的逻辑。
答案 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