функция для связывания списка фреймов разных столбцов и строк - PullRequest
0 голосов
/ 08 ноября 2019

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

df <- list()

df[[1]] <-  data.frame(d = c(4,5), e = c("c", "d"))
rownames(df[[1]]) <- c("df2_row_1", "df2_row_2")

df[[2]] <- data.frame(a = c(1,2,3), b = c("a", "b", "c"), c = c("one", "two", "three"))
rownames(df[[2]]) <- c("df1_row_1", "df1_row_2", "df1_row_3")


df[[3]] <- data.frame(f = c(6,7,8), g = c("e", "f", "g"), h = c("one", "two", "three"), w = c(100,101,102))
rownames(df[[3]]) <- c("df3_row_1", "df3_row_2", "df3_row_3")

Текущий вывод:

do.call(bind_rows, df)

   d    e  a    b     c  f    g     h   w
1  4    c NA <NA>  <NA> NA <NA>  <NA>  NA
2  5    d NA <NA>  <NA> NA <NA>  <NA>  NA
3 NA <NA>  1    a   one NA <NA>  <NA>  NA
4 NA <NA>  2    b   two NA <NA>  <NA>  NA
5 NA <NA>  3    c three NA <NA>  <NA>  NA
6 NA <NA> NA <NA>  <NA>  6    e   one 100
7 NA <NA> NA <NA>  <NA>  7    f   two 101
8 NA <NA> NA <NA>  <NA>  8    g three 102

Требуемый вывод

          d e  
df2_row_1 4 c 
df2_row_2 5 d
          a b     c 
df1_row_1 1 a   one 
df1_row_2 2 b   two 
df1_row_3 3 c three 
          f g     h   w
df3_row_1 6 e   one 100
df3_row_2 7 f   two 101
df3_row_3 8 g three 102

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

Я также понимаю, что это не может быть более аккуратным - возможно ли это?

Спасибо !!!

1 Ответ

1 голос
/ 09 ноября 2019

Это может быть достигнуто с помощью цикла for (я думаю, что это может быть достигнуто с помощью mapply to, проверьте ?mapply). Общая стратегия заключается в заполнении каждого df в списке NA (cbind, используя их), а затем rbindlist в результирующем списке:

library(data.table)

cols <- max(sapply(df, ncol))

# This is the length of the NA vectors that make the cbinding dfs:
lengths <- (cols - sapply(df, ncol))*sapply(df, nrow)

newdf <- list()

for (i in 1:length(df)){
  if (ncol(df[[i]]) != cols){
    newdf[[i]] <- cbind(df[[i]], 
                        as.data.frame(matrix(rep(NA, lengths[i]), 
                                             ncol = lengths[i] / nrow(df[[i]]))))
  } else {
    newdf[[i]] <- df[[i]]
  }
}

rbindlist(newdf, use.names = FALSE)

, что приводит к:

   d e    V1  V2
1: 4 c  <NA>  NA
2: 5 d  <NA>  NA
3: 1 a   one  NA
4: 2 b   two  NA
5: 3 c three  NA
6: 6 e   one 100
7: 7 f   two 101
8: 8 g three 102
...