在R合并功能中复制行

时间:2018-06-23 10:21:31

标签: r

我正在尝试在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

3 个答案:

答案 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)