Пакет R-ff: найти наиболее часто встречающийся элемент в ffdf и удалить строки, в которых он находится

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

Вот небольшой пример:

 # create a base R Matrix

 > z<-matrix(c("a", "b", "a", "c", "b", "b", "c", "c", "b", "a"),nrow=5,ncol=2,byrow = TRUE)
 > z


     [,1] [,2]
 [1,] "a"  "b" 
 [2,] "a"  "c" 
 [3,] "b"  "b" 
 [4,] "c"  "c" 
 [5,] "b"  "a" 


 # convert z to ffdf

 > u=as.data.frame(z, stringsAsFactors=TRUE)
 > u=as.ffdf(u)
 > u

  ffdf data
   V1 V2
1  a  b
2  a  c
3  b  b
4  c  c
5  b  a

Я ищу:

  • Экспортировать наиболее часто встречающийся элемент в ffdf (в данном случае это «b»)
  • Удалить из ffdf все строки, где находится "b"

Итак, новый ffdf должен быть таким, как показано ниже:

   V1 V2
1  a  c
2  c  c

В базе R нашел способ с функцией "таблица"

  temp <- table(as.vector(z))  
  t1<-names(temp)[temp == max(temp)] 
  z1<- z[rowSums(z== t1[1]) == 0, ]    

Но для работы с огромными данными мне нужно что-то вроде пакета ff.


person pshls    schedule 27.05.2015    source источник


Ответы (1)


require(ff)
z <- matrix(c("a","b","f","c","f","b","e","c","b","e"),nrow=5,ncol=2,byrow = TRUE)
u <- as.data.frame(z, stringsAsFactors=TRUE)
u <- as.ffdf(u)
u

Следующее должно работать с набором данных любого размера. Он использует table.ff и ffthat из ffbase, frowapply из ff и индексирование на основе целочисленных векторов ff.

require(ffbase)
require(plyr)
## Detect most frequent item (assuming the levels of all columns can be different)
columnfreqs <- lapply(colnames(u), FUN=function(column) table(u[[column]]))
columnfreqs <- lapply(columnfreqs, FUN=function(x) as.data.frame(t(as.matrix(x))))
itemfreqs <- colSums(do.call(rbind.fill, columnfreqs), na.rm=TRUE)
mostfrequent <- names(sort(itemfreqs, decreasing = TRUE))[1]

## Identify the lines where the most frequent item occurs in each row of the ffdf 
idx <- ffrowapply(
  EXPR = apply(u[i1:i2,], MARGIN=1, FUN=function(row) any(row %in% mostfrequent)), 
  X=u, 
  RETURN = TRUE, FF_RETURN = TRUE, RETCOL = NULL, VMODE = "logical")
idx <- ffwhich(idx, idx != TRUE) # remove it is in there + convert logicals to integers

## Remove them
u[idx, ]
person Community    schedule 30.05.2015