Как связать два столбца ffdf

Предположим, два файла ffdf:

library(ff)
ff1 <- as.ffdf(data.frame(matrix(rnorm(10*10),ncol=10)))
ff2 <- ff1
colnames(ff2) <- 1:10

Как я могу привязать их к столбцам, не загружая их в память? cbind не работает.

Есть тот же вопрос http://stackoverflow.com/questions/18355686/columnbind-ff-data-frames-in-r но в нем нет MWE и автор забросил его поэтому я сделал репост.


person user2763361    schedule 16.12.2013    source источник
comment
объединение без загрузки в память...? Как именно это будет выглядеть?   -  person Ricardo Saporta    schedule 16.12.2013
comment
@RicardoSaporta Я не знаю. Я могу делать множество других вещей с объектами ff, не загружая исходный полный фрейм данных в память, поэтому я подумал, что cbind тоже может быть возможным.   -  person user2763361    schedule 16.12.2013


Ответы (2)


Вы можете использовать следующую конструкцию cbind.ffdf2, убедившись, что имена столбцов двух входных ffdf не дублируются:

library(ff)
ff1 <- as.ffdf(data.frame(letA = letters[1:5], numA = 1:5))
ff2 <- as.ffdf(data.frame(letB = letters[6:10], numB = 6:10))

cbind.ffdf2 <- function(d1, d2){
  D1names <- colnames(d1)
  D2names <- colnames(d2)
  mergeCall <- do.call("ffdf", c(physical(d1), physical(d2)))
  colnames(mergeCall) <- c(D1names, D2names)
  mergeCall
}

cbind.ffdf2(ff1, ff2)[,]

Результат:

   letA numA letB numB
1   a    1    f     6
2   b    2    g     7
3   c    3    h     8
4   d    4    i     9
5   e    5    j    10
person Audrey    schedule 07.03.2014
comment
Элегантное решение. Если вы хотите, чтобы это было включено в ffbase, разместите запрос функции на github.com/edwindj/ffbase/ вопросы - person ; 07.03.2014
comment
Спасибо. Не удается найти категорию «новая функция». Улучшение? - person Audrey; 07.03.2014
comment
Нажмите «Новая проблема» и отметьте ее как улучшение. - person ; 07.03.2014
comment
Поднял. Выяснение того, как пометить его любым ярлыком, оказалось выше моей интуиции (этот или github UX для нубов плох), поэтому он остался без пометки :-) - person Audrey; 07.03.2014

Извините за столь позднее присоединение. Если вы хотите связать произвольное количество объектов ffdf, не беспокоясь о дублирующихся столбцах. Вы можете попробовать это (основываясь на решении Одри).

ff1 <- as.ffdf(data.frame(letA = letters[1:5], numA = 1:5))
ff2 <- as.ffdf(data.frame(letA = letters[6:10], numB = 6:10))

cbind.ffdf2 <- function(...){
  argl <- list(...)
  if(length(argl) == 1L){
    return(argl[[1]])
  }else{
    physicalList = NULL
    for(i in 1:length(argl)){
      if(class(argl[[i]]) == "data.frame"){
        physicalList = c(physicalList, physical(as.ffdf(argl[[i]])))
      }else{
        physicalList = c(physicalList, physical(argl[[i]]))
      }

    }
    mergeCall <- do.call("ffdf", physicalList)
    return(mergeCall)
  }

}

cbind.ffdf2(ff1, ff2)

Он также преобразует любой объект фрейма данных в список в объект ffdf.

person Joshua Oluoch    schedule 15.06.2015