2017-04-04 48 views
0

我在更大的數據集中執行以下操作時遇到問題。我想知道是否有內置的方法來使用ff或ffdf來完成它。將值重新分配給ffdf中的列[R]

實施例:

require(ffbase) 
> iris 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   5.1   3.5   1.4   0.2  setosa 
2   4.9   3.0   1.4   0.2  setosa 
3   4.7   3.2   1.3   0.2  setosa 
4   4.6   3.1   1.5   0.2  setosa 

#Convert to ff object 
A <- as.ffdf(iris) 

我可以訪問「物種」列

A$species 
> A$Species 
ff (open) integer length=150 (150) levels: setosa versicolor virginica 
     [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]    [143]  [144] 
setosa setosa setosa setosa setosa setosa setosa setosa   : virginica virginica 
    [145]  [146]  [147]  [148]  [149]  [150] 
virginica virginica virginica virginica virginica virginica 

但是,如果我想:使用SUBSTR並重新分配它作爲一個不同的列修改字符列在ffdf對象以子字符串1到3,例如,我得到以下錯誤:

> substr(as.character(A$Species),1,3) 
Error in substr(as.character(A$Species), 1, 3) : 
    extracting substrings from a non-character object 

有什麼準則來修改ffdf對象中的列?

編輯

我也嘗試了ffdfdply的方法。這似乎需要很長的一個相當小的數據:

substrff <- function(x){ 
    x$new <- substr(x$Species,1,8) 
    return(x) 
} 

B <- ffdfdply(x=A, split = A$Species, FUN = substrff) 

回答

1
require(ffbase) 
data(iris, package = "datasets") 
x <- as.ffdf(iris) 
x$spec <- with(x[c("Species")], substr(Species, 1, 4)) 
+0

謝謝!我不知道「with」或「with.ffdf」的功能是否允許列上的大多數操作? – dleal

+1

with.ffdf將數據以行塊形式存儲在RAM中(受RAM可用性的限制),然後您可以對指定的列執行任何矢量化操作。 – jwijffels