0

我有一个数据框和一个函数,这对于一个例子来说都太复杂了,但我想做的就是修改数据框中的每一行。该函数只需要一个向量并根据其他值修改一些值,尺寸保持不变。

newt = data.frame()
for(i in 1:nrow(t)){
  row = t[i,]
  newt = rbind(newt,f(row))
}
t = newt

目前我正在使用一个 for 循环,我理解它既不是 Ry 做事的方式,而且速度也非常慢(我的实际数据中有大约 100 万行)。

我强烈尝试避免使用 plyr 或 data.table 或任何其他包,因为已经围绕我拥有的结构编写了很多代码,我想避免额外的复杂性。Apply 似乎将所有内容都更改为数组或矩阵,但我的列是各种类型,所以这不是一个选项。我尝试使用 plyr 中的 adply ,但这不是内存效率,并且对于体面的输入会崩溃。

4

1 回答 1

3

一开始可能会很复杂,但是data.tableandplyr包对于这类事情来说非常棒。一旦你熟悉了它们,你就没有问题了。

如果您的要求是严格使用base函数并避免使用apply,则可以通过将每一行插入 data.frame 而不是rbinding 来提高效率:

> f = function(iRow) {if(iRow$A=="a") iRow$B == iRow$B * 2 ; return(iRow)}

> df = data.frame(A=letters[sample(1:26, 1000, replace=TRUE)], B=rnorm(1000))

> DF = data.frame(df[0,])
> system.time(for(i in 1:nrow(df)) {Row = df[i,] ; DF = rbind(DF, f(Row))})
   user  system elapsed 
   0.61    0.00    0.61 

> DF = data.frame(df[0,])
> system.time(for(i in 1:nrow(df)) {Row = df[i,] ; DF[i,] = f(Row)})
   user  system elapsed 
   0.28    0.00    0.28 

如果你学会使用data.table

> system.time(dt[,B:=if(A=="a") B * 2,by=1:nrow(dt)])
   user  system elapsed 
   0.04    0.00    0.03 
于 2013-09-06T18:32:41.190 回答