Дублирование строк в функции слияния R - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь запустить эту функцию слияния в 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 голосов
/ 23 июня 2018

Вы должны взять больше столбцов из исходной таблицы, чтобы убедиться, что ваши наблюдения уникально идентифицированы.

Сначала мы создаем все эти 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
0 голосов
/ 24 июня 2018

Спасибо, ребята!Да, проблема была с дублирующимися именами в 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)
0 голосов
/ 23 июня 2018

Проблема в том, что ваши переменные не являются уникальными.Если вы объедините их, вы получите все больше и больше строк.Вы должны посмотреть, что вы получите, когда сделаете:

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)
}

Обычно я бы использовал объект списка в цикле, а позже посмотримчто мне нужно сделать с данными в списке.Это предотвращает создание непреднамеренных побочных эффектов при использовании объединений / слияний и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...