cbind a df с пустым df (cbind.fill?)

Я думаю, что я ищу аналог rbind.fill (в пакете plyr Хэдли) для cbind . Я посмотрел, но нет cbind.fill .

Я хочу сделать следующее:

 #set these just for this example one_option <- TRUE diff_option <- TRUE return_df <- data.frame() if (one_option) { #do a bunch of calculations, produce a data.frame, for simplicity the following small_df small_df <- data.frame(a=1, b=2) return_df <- cbind(return_df,small_df) } if (diff_option) { #do a bunch of calculations, produce a data.frame, for simplicity the following small2_df small2_df <- data.frame(l="hi there", m=44) return_df <- cbind(return_df,small2_df) } return_df 

Понятно, что это приводит к ошибке:

 Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 1 

Мое текущее исправление заключается в замене строки return_df <- data.frame() на return_df <- data.frame(dummy=1) а затем код работает. Затем я просто return_df манекен из return_df в конце. После добавления манекена и выполнения вышеуказанного кода, я получаю

  dummy ablm 1 1 1 2 hi there 44 

Затем мне просто нужно избавиться от манекена, например:

 > return_df[,2:ncol(return_df)] ablm 1 1 2 hi there 44 

Я уверен, что мне не хватает более простого способа сделать это.

edit: Я предполагаю, что я не ищу cbind.fill, потому что это будет означать, что значение NA будет создано после cbind, чего я не хочу.

Вот cbind fill:

 cbind.fill <- function(...){ nm <- list(...) nm <- lapply(nm, as.matrix) n <- max(sapply(nm, nrow)) do.call(cbind, lapply(nm, function (x) rbind(x, matrix(, n-nrow(x), ncol(x))))) } 

Давай попробуем:

 x<-matrix(1:10,5,2) y<-matrix(1:16, 4,4) z<-matrix(1:12, 2,6) cbind.fill(x,y) cbind.fill(x,y,z) cbind.fill(mtcars, mtcars[1:10,]) 

Кажется, я где-то украл это.

ИЗМЕНИТЬ СТОЛ ИЗ ЗДЕСЬ: ССЫЛКА

Хотя, я думаю, решение Тайлера прямое и лучшее здесь, я просто предоставляю другой путь, используя rbind.fill() который у нас уже есть.

 require(plyr) # requires plyr for rbind.fill() cbind.fill <- function(...) { transpoted <- lapply(list(...),t) transpoted_dataframe <- lapply(transpoted, as.data.frame) return (data.frame(t(rbind.fill(transpoted_dataframe)))) } 

Использование rowr::cbind.fill

 rowr::cbind.fill(df1,df2,fill = NA) AB 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 NA 6 

cbind.na из пакета qpcR может это сделать.

  install.packages("qpcR") library(qpcR) qpcR:::cbind.na(1, 1:7) 

Я предлагаю модификацию ответа Тайлера. Моя функция позволяет cbind -ing data.frames и / или матриц с векторами без потери имен столбцов, как это происходит в решении Тайлера

 cbind.fill <- function(...){ nm <- list(...) dfdetect <- grepl("data.frame|matrix", unlist(lapply(nm, function(cl) paste(class(cl), collapse = " ") ))) # first cbind vectors together vec <- data.frame(nm[!dfdetect]) n <- max(sapply(nm[dfdetect], nrow)) vec <- data.frame(lapply(vec, function(x) rep(x, n))) if (nrow(vec) > 0) nm <- c(nm[dfdetect], list(vec)) nm <- lapply(nm, as.data.frame) do.call(cbind, lapply(nm, function (df1) rbind(df1, as.data.frame(matrix(NA, ncol = ncol(df1), nrow = n-nrow(df1), dimnames = list(NULL, names(df1))))) )) } cbind.fill(data.frame(idx = numeric()), matrix(0, ncol = 2), data.frame(qwe = 1:3, rty = letters[1:3]), type = "GOOD", mark = "K-5") # idx V1 V2 qwe rty type mark # 1 NA 0 0 1 a GOOD K-5 # 2 NA NA NA 2 b GOOD K-5 # 3 NA NA NA 3 c GOOD K-5 

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

  newdf <- data.frame() # add the first column newdf <- rbind(newdf,data.frame("col1"=c("row1"=1,"row2"=2))) # add the second column newdf <- cbind(newdf,data.frame("col2"=c("row1"=3,"row2"=4))) # add more columns newdf <- cbind(newdf,data.frame("col3"=c("row1"=5,"row2"=6))) # result # col1 col2 col3 #row1 1 3 5 #row2 2 4 6 

Я не знаю почему, но это работает для меня.

  • Прочтите файл csv в R со столбцом валюты как числовой
  • Настройка прокси для R
  • Создать таблицу PDF
  • добавление NA, чтобы все элементы списка равны длине
  • Отправка электронной почты в R через Outlook
  • Слишком мало периодов для разложения ()
  • Какая польза от этого?
  • Создать имя переменной с «вставкой» в R?
  • вытащить p-значения и r-квадрат из линейной регрессии
  • как вы отправляете письмо от R
  • R - вырезание с помощью заданного интервала
  • Давайте будем гением компьютера.