繁体   English   中英

在R合并函数中复制行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM