修改R数据帧的每一行

时间:2013-09-06 18:10:36

标签: r dataframe

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

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

目前我正在使用for循环,我理解这不是R-y做事的方式,而且它也非常慢(我的实际数据中有大约1百万行)。

我强烈要求避免使用plyr或data.table或任何其他软件包,因为我已经在我的结构周围编写了大量代码,并且我希望避免额外的复杂性。应用似乎将所有内容更改为数组或矩阵,但我的列具有各种类型,因此这不是一个选项。我尝试从plyr使用adply,但这不是内存效率和崩溃的适当大小的输入。

1 个答案:

答案 0 :(得分:3)

一开始可能很复杂,但data.tableplyr包非常适合这类事情。一旦你熟悉它们就没问题了。

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

> 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