我有一个数据框和一个功能,对于一个例子来说太复杂了,但我想要做的就是修改数据框中的每一行。该函数只需一个向量并根据其他值修改一些值,维度保持不变。
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,但这不是内存效率和崩溃的适当大小的输入。
答案 0 :(得分:3)
一开始可能很复杂,但data.table
和plyr
包非常适合这类事情。一旦你熟悉它们就没问题了。
如果您的要求严格使用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