R:需要帮助来加速在data.frame中创建新列

时间:2014-04-26 10:00:34

标签: r performance dataframe data.table

我需要帮助来加速一些代码。我有data.frame" df"并希望创建新列并使用给定值填充它们。这是一个示例代码,我是如何做到的。

df <- as.data.frame(1:20)

a <- c(31:50)
b <- c(201:220)

df[c("A","B")] <- c(a, b) 

现在问题是我的数据很大(几百万行)并且花费的时间比预期的多,所以我认为有更好的方法。有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分:5)

扩展data.frame(或任何对象)的任务导致R在您尝试添加新列时复制整个对象。包data.table提供了一些添加到data.frame模型的强大性能功能。它允许(除其他外)添加列到位。请参阅下面的代码以获得简单的演示:

require(data.table)
a2 <- data.table(x=1:10)
a2[, y:=21:30]   ## this will create y inside a2 without copying it
summary(a2)      ## just like using a data.frame

生成的对象(data.table)将与(几乎)所有使用data.frame的代码一起使用。它具有大多数操作的替代语法,其执行效率更高。值得花些时间研究一下。


如果您想添加多个列,则:

a2[, `:=`(y=21:30, z=31:40)]

编辑:@Thell已花时间并使用不同的方法准备基准来扩展data.frame。他们建议,尽管复制data.frame更快。请记住这一点,并查看哪一个最适合您的代码。

答案 1 :(得分:3)

你说你有'几百万'行,所以这里有3列1000万行基准的摘录......

R 3.0.3 (在具有2GB内存的32位赛扬系统上)

## Unit: microseconds
##           expr     min      lq  median      uq     max neval
##    dt.addC(dt)   35.38   56.03   64.82   67.77   185.2   100
##     df.add(df)  181.43  214.80  221.42  229.81   366.6   100
##    dt.addB(dt) 2359.54 2457.09 2513.11 2577.00  6398.0   100
##    dt.addA(dt) 2913.74 2995.64 3047.29 3125.82  6791.1   100

R 3.1.0 (在64位Haswell i7 w / 24 GB内存上)

## Unit: microseconds
##           expr       min        lq    median        uq       max neval
##     df.add(df)     10.25     30.74     33.36     48.53     84.25   100
##    dt.addC(dt)  27120.45  27563.79  27990.22  29642.46  87637.63   100
##    dt.addB(dt)  38452.71  39018.90  46225.69  50142.46 130893.53   100
##    dt.addA(dt) 193268.78 247749.71 251380.74 256380.43 440916.17   100

注意: 3.1.0上data.framedata.table之间的差异可以用R 3.1.0处理赋值的新方法来解释。 Arun(data.table作者之一)在chat log中这样做。


df.add(将列添加到dat.frame的常用基本方法)。

df$b <- b.vals
df$c <- c.vals

dt.addA(适用于data.frame的公共基础data.table方法)

dt$b <- b.vals
dt$c <- c.vals

dt.addB(添加列的常用data.table方式)

dt[,`:=`(b=b.vals, c=c.vals)]

dt.addC(另一种data.table设置值的方法[来自Arun])

## to reduce the overhead due to `[.data.table` on small data.frames.
set(dt, j="b", value=b.vals)
set(dt, j="c", value=c.vals)

其他数据集大小的基准

i7系统上的R 3.1.0

# Test @ 1,000
## Unit: microseconds
##           expr      min      lq  median      uq      max neval
##    dt.addC(dt)    6.007   10.38   11.71   12.50    20.79   100
##     df.add(df)   11.534   19.49   20.57   21.32   940.63   100
##    dt.addB(dt)  326.166  344.85  351.43  365.47  1412.86   100
##    dt.addA(dt)  798.777  850.47  867.60  888.23  1935.20   100

##            test relative
## 1    df.add(df)        1
## 4   dt.addC(dt)        1
## 3   dt.addB(dt)       35
## 2   dt.addA(dt)       87

# Test @ 10,000
## Unit: microseconds
##           expr     min      lq  median      uq     max neval
##    dt.addC(dt)   11.13   17.88   19.20   20.80   988.9   100
##     df.add(df)   10.97   20.56   22.65   24.94    41.1   100
##    dt.addB(dt)  333.17  364.15  389.87  419.08  1347.0   100
##    dt.addA(dt)  823.99  875.88  897.10 1076.90 29233.1   100

##            test relative
## 1    df.add(df)        1
## 4   dt.addC(dt)        1
## 3   dt.addB(dt)       19
## 2   dt.addA(dt)       50

# Test @ 10,000,000
## Unit: microseconds
##           expr       min        lq    median        uq       max neval
##     df.add(df)     10.25     30.74     33.36     48.53     84.25   100
##    dt.addC(dt)  27120.45  27563.79  27990.22  29642.46  87637.63   100
##    dt.addB(dt)  38452.71  39018.90  46225.69  50142.46 130893.53   100
##    dt.addA(dt) 193268.78 247749.71 251380.74 256380.43 440916.17   100

##            test relative
## 1    df.add(df)        1
## 4   dt.addC(dt)     1536
## 3   dt.addB(dt)     2213
## 2   dt.addA(dt)    11667

赛扬系统的R 3.0.3

# Test @ 1,000
## Unit: microseconds
##           expr     min      lq  median      uq     max neval
##    dt.addC(dt)   55.78   82.58   94.48   96.14   176.1   100
##     df.add(df)  182.65  215.36  220.10  225.03   361.6   100
##    dt.addB(dt) 2699.10 2774.61 2827.34 2894.23  3442.2   100
##    dt.addA(dt) 5259.89 6066.00 6122.37 6231.50 10265.9   100

##            test relative
## 4   dt.addC(dt)    1.000
## 1    df.add(df)    2.889
## 3   dt.addB(dt)   32.444
## 6 dfadd2dtB(dt)   69.667
## 2   dt.addA(dt)   69.889
## 5 dfadd2dtA(dt)   96.000

# Test @ 10,000
## Unit: microseconds
##           expr    min     lq median      uq   max neval
##    dt.addC(dt)  134.0  162.8  168.7   185.8  4135   100
##     df.add(df)  576.7  616.4  633.7   663.2 72749   100
##    dt.addB(dt) 2789.8 2932.6 2993.0  3054.7  6702   100
##    dt.addA(dt) 5400.6 6701.5 6819.0 10079.2 11518   100

##            test relative
## 4   dt.addC(dt)    1.000
## 1    df.add(df)    8.143
## 3   dt.addB(dt)   14.619
## 2   dt.addA(dt)   34.286
## 6 dfadd2dtB(dt)   34.381
## 5 dfadd2dtA(dt)   53.810

# Test @ 10,000,000
## Unit: milliseconds
##           expr    min     lq median     uq    max neval
##    dt.addC(dt)  121.1  146.2  147.2  161.8  303.8   100
##    dt.addB(dt)  197.7  225.4  228.0  270.2  380.7   100
##     df.add(df)  767.8  823.5  857.0  938.2 1156.9   100
##    dt.addA(dt)  709.6 1071.9 1112.6 1170.1 1343.9   100

##            test relative
## 4   dt.addC(dt)    1.000
## 3   dt.addB(dt)    1.566
## 1    df.add(df)    6.172
## 2   dt.addA(dt)    7.594
```

系统/会话信息......

Intel® Core™ i7-4700MQ Processor
24 GB

## R version 3.1.0 (2014-04-10)
## Platform: x86_64-pc-linux-gnu (64-bit)
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] rbenchmark_1.0.0     microbenchmark_1.3-0 data.table_1.9.2    
## 

## "Linux" "3.11.0-19-generic" "x86_64"


Intel(R) Celeron(R) CPU 2.53GHz
2 GB

## R version 3.0.3 (2014-03-06)
## Platform: i686-pc-linux-gnu (32-bit)
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] rbenchmark_1.0.0     microbenchmark_1.3-0 data.table_1.9.2    
## [4] knitr_1.5           
## 

## "Linux" "3.2.0-60-generic-pae" "i686"

答案 2 :(得分:1)

为什么不简单地执行以下操作:

df <- data.frame (x=1:20)
df$a <- 31:50
df$b <- 201:220

有一本名为“R Fundamentals and Graphics”的优秀电子书,可让您充分了解R及其图形功能的基础知识。