Объединение одинаковых фреймов данных (сходство по длине) в списке с помощью rbind

r

28 просмотра

1 ответ

У меня есть список фреймов данных с разной длиной каждый (есть только четыре разных длины, в примере 3). То, что я хочу сделать, это связать фреймы данных одинаковой длины, чтобы получить четыре больших фрейма данных в качестве конечного результата.

Я попытался написать цикл, который проверяет, берет ли фрейм данных "i" из списка, затем проверяет все другие фреймы данных "j", кроме фрейма данных "i-й" из моего списка, и выполняет rbind, если они имеют одинаковый длина (и сохраняет вывод). Я считаю, что проблема в моем цикле состоит в том, что во многих случаях один и тот же фрейм данных просто дублируется и объединяется (например, rbind (df1, df1), но я не могу понять, почему или как это исправить.

#create list of dataframes
df1 <- data.frame("Var1" = c(1:10))
df2 <- data.frame("Var1" = c(1:10),"Var2" = c(1:10))
df3 <- data.frame("Var1" = c(1:10),"Var2" = c(1:10),"Var3" = c(1:10))
df4 <- data.frame("Var1" = c(11:20))
df5 <- data.frame("Var1" = c(11:20),"Var2" = c(11:20),"Var3" = c(11:20))
df.list <- list("df2" = df2,"df1" = df1, "df3" = df3, "df4" = df4, "df5" = df5)

#write the loop
df.list2 <- list()
for (i in seq_along(df.list)){
  for (j in 3:length(df.list)-1){
    if(length(df.list[[i]]) == length(df.list[[j]])){
      df.list2[[i]] <- rbind(df.list[[i]],df.list[[j]])
    } 
  }
}


#this is what it SHOULD look like (example for df1 and df4 (which both have length 1)
df.list3 <- list()
df.list3[[1]] <- rbind(df.list[[2]],df.list[[4]])
df.list3[[1]]

   Var1
1     1
2     2
3     3
4     4
5     5
6     6
7     7
8     8
9     9
10   10
11   11
12   12
13   13
14   14
15   15
16   16
17   17
18   18
19   19
20   20

Я понял, что при использовании этих методов неизбежно появятся дубликаты, и пока я играю, удаляя их с уникальными позже.

Если есть лучший способ решить эту проблему, я, конечно, открыт для этого, не нужно быть циклом. Но это было как можно ближе.

Так что в идеале в примере я должен оставить 3 кадра данных после удаления дубликатов, которые:

rbind(df1,d4)   #length 1
df2             #length 2
rbind(df3,df5)  #length 3
Автор: Susu Источник Размещён: 08.11.2019 11:22

Ответы (1)


1 плюс

Решение

Мы split«df.list» вектором числа столбцов в каждой из data.frame в list( sapply(df.list, ncol)) , а затем rbindв splitdata.frames Ted вместе.

lapply(split(df.list, sapply(df.list, ncol)), function(x) do.call(rbind, x))

Более быстрый вариант будет использовать rbindlistотdata.table

library(data.table)
lapply(split(df.list, sapply(df.list, ncol)), rbindlist)
Автор: akrun Размещён: 20.08.2016 01:33
Вопросы из категории :
32x32