[英]Duplicating rows in R merge function
我想在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并且发生了相同的行为)。
提前感谢您的任何意见。
若昂
您遇到的问题是您的变量不是唯一的。 如果合并它们,您将获得越来越多的行。 你应该看看你做了什么:
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)
}
通常我会在循环中使用列表对象,稍后会看到我需要对列表中的数据做些什么。 它可以防止在使用连接/合并等时产生意外的副作用。
您必须从源表中获取更多列,以确保您的观察结果具有唯一标识。
我们首先构建所有这些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
多谢你们! 是的,问题在于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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.