刚刚和同事谈过这个问题,我们认为看看SO土地上的人们不得不说出来是值得的.假设我有一个包含N个元素的列表,其中每个元素都是长度为X的向量.现在假设我想将其转换为data.frame.与R中大多数事情一样,有剥皮众所周知的猫的多种方式,比如as.dataframe,使用plyr包,comboing do.call用cbind,预分配的DF和填充它,和其他人.
提出的问题是当N或X(在我们的例子中是X)变得非常大时会发生什么.当效率(特别是在记忆方面)至关重要时,是否有一种猫皮肤方法显着优越?
为什么在具有相同数量元素的data.frame上进行比较需要更长的时间,但在向量化操作上排列在更多列中?举一个这个简单的例子,我们从每个元素中减去0.5,然后比较它,看它是否<0(与这个问题相关):
f.df <- function( df , x = 0.5 ){
df <- df - x
df[ df < 0 ] <- 0
return( df )
}
df1 <- data.frame( matrix( runif(1e5) , nrow = 1e2 ) )
df2 <- data.frame( matrix( runif(1e5) , nrow = 1e3 ) )
df3 <- data.frame( matrix( runif(1e5) , nrow = 1e4 ) )
require( microbenchmark )
microbenchmark( f.df( df1 ) , f.df( df2 ) , f.df( df3 ) , times = 10L …Run Code Online (Sandbox Code Playgroud) 我有一个大小均匀的字符向量列表,我希望将它们有效地组合到一个数据帧中,列表中的向量成为新数据帧的行。以下ls是我的列表,df也是我的预分配数据框。
ls <- list(c("r1c1", "r1c2", "r1c3"),
c("r2c1", "r2c2", "r2c3"))
df <- data.frame(col1 = character(), col2 = character(), col3 = character(),
stringsAsFactors = F)
# Desired Result:
col1 col2 col3
1 r1c1 r1c2 r1c3
2 r2c1 r2c2 r2c3
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试过rbind(df, ls)按列创建新的数据框,df如下所示:
c..r1c1....r1c2....r1c3.. c..r2c1....r2c2....r2c3..
4 r1c1 r2c1
5 r1c2 r2c2
6 r1c3 r2c3
Run Code Online (Sandbox Code Playgroud)
我也尝试过rbind在for循环中执行以下操作:
for (i in 1:length(ls))
df <- rbind(df, ls[[i]])
Run Code Online (Sandbox Code Playgroud)
但是,这给了我警告信息:invalid factor level, NA generated,即使我最初设置stringsAsFactors为false。当不断在较大的列表上执行时,Rbind似乎也是一个缓慢的过程,因此,我想尽可能地减少其使用。
任何帮助将不胜感激。