我正在尝试在R中运行此合并功能:
nomes <- '0'
dt <- data.frame("variable" = Level12R$level1.2_are.out$parameters$stdyx.standardized[,2])
for(i in 1:length(Level12R)) {
nomes[i] = names(Level12R)[i]
df = eval(parse(text=paste0("Level12R$",nomes[i],"$parameters$stdyx.standardized", collapse=NULL)))
df <- df[,2:3]
names(df)<-c("variable",toupper(substr(nomes[i],10,12)))
dt <- merge(x=dt, y=df, by = "variable", all.x = TRUE)
}
在以下数据Level12R.rds上。合并功能有效,但是我得到了重复的行...由于在几个循环后循环从1到48,我的dt对象有数百万个观测值。
这里有什么问题的主意吗? (我还尝试了dplyr :: left_join,并且发生了相同的行为。)
谢谢您的任何评论。
João
答案 0 :(得分:2)
您遇到的问题是变量不是唯一的。如果合并它们,您将获得越来越多的行。您应该看看自己所做的事情:
dt <- data.frame(level12R$level1.2_are.out$parameters$stdyx.standardized[,1:2])
tail(dt)
paramHeader param
30 ASRREA.ON ATBR10CG
31 ASRREA.ON ATBR10DG
32 ASRREA.ON ATBR10FG
33 ASRREA.ON ATBR12AG
34 Intercepts ASRREA
35 Residual.Variances ASRREA
您可以看到变量的最后一个相同,但是来自不同的标头。
因此,我们必须扩展连接,以便创建唯一的记录。查看需要3列,1、2和8列的“标题”,“变量”和“之间”的数据。然后,我们可以遍历所有内容而无需获取重复的记录。您的dt对象最终包含35条记录和51个具有NA的变量,结果不是35条记录,而是34条甚至25条。
nomes <- '0'
dt <- data.frame(Level12R$level1.2_are.out$parameters$stdyx.standardized[,c(1:2, 8)])
names(dt)<-c("header", "variable", "betweenwithin")
for(i in 1:length(Level12R)) {
nomes[i] = names(Level12R)[i]
df = eval(parse(text=paste0("Level12R$",nomes[i],"$parameters$stdyx.standardized", collapse=NULL)))
df <- df[,c(1:3, 8)]
names(df)<-c("header", "variable", toupper(substr(nomes[i],10,12)), "betweenwithin")
dt <- left_join(x=dt, y=df)
}
通常,我会在循环中使用列表对象,然后再查看需要对列表中的数据进行哪些操作。使用连接/合并等方法时,它可以防止产生意外的副作用。
答案 1 :(得分:1)
您必须从源表中获取更多列,以确保唯一标识您的观察结果。
我们首先构建所有data.frames
,然后使用Reduce
将它们加入:
dfs <- Map(Level12R, names(Level12R), f = function(x,y){
df <- x$parameters$stdyx.standardized[c(1:3,8)]
setNames(df,c("paramHeader","variable",toupper(substr(y,10,12)),"BetweenWithin"))
})
dt <- Reduce(function(x,y) merge(x,y,all.x=TRUE),dfs)
dt[1:5,1:8]
# paramHeader variable BetweenWithin ARE AUS AUT AZE BGR
# 1 ASRREA.ON ACBG03A Between -0.060 -0.140 -0.369 0.034 -0.002
# 2 ASRREA.ON ACBG12BD Between -0.041 -0.108 -0.003 -0.029 0.159
# 3 ASRREA.ON ACBG13H Between -0.121 -0.143 -0.106 -0.112 -0.011
# 4 ASRREA.ON ACBGDAS Between 0.143 0.112 0.009 -0.053 -0.086
# 5 ASRREA.ON ACBGEAS Between 0.031 0.088 0.116 -0.336 0.359
答案 2 :(得分:0)
谢谢大家!是的,问题出在df中重复的名称。 因此,我的解决方案是:
nomes<-'0'
dt<- data.frame("variable" = paste0(Level12R$level1.2_are.out$parameters$stdyx.standardized[,1],
Level12R$level1.2_are.out$parameters$stdyx.standardized[,2],
Level12R$level1.2_are.out$parameters$stdyx.standardized[,8]))
for (i in 1:length(Level12R)){
nomes[i] = names(Level12R)[i]
df = eval(parse(text=paste0("Level12R$",nomes[i],"$parameters$stdyx.standardized", collapse=NULL)))
df<-df[,2:3]
names(df)<-c("variable",toupper(substr(nomes[i],10,12)))
n1 = eval(parse(text=paste0("Level12R$",nomes[i],"$parameters$stdyx.standardized","[1]", collapse=NULL)))
n2 = eval(parse(text=paste0("Level12R$",nomes[i],"$parameters$stdyx.standardized","[2]", collapse=NULL)))
n3 = eval(parse(text=paste0("Level12R$",nomes[i],"$parameters$stdyx.standardized","[8]", collapse=NULL)))
varnames <- paste0(n1[,],n2[,],n3[,])
df[,1]<-varnames
dt<-merge(x=dt, y=df, by = "variable", all.x = TRUE)
}
## So now a nice summary per variable
dt2 <- data.frame(t(dt[-1]))
colnames(dt2) <- dt[, 1]
skim(dt2)