我需要帮助来加速一些代码。我有data.frame
" df"并希望创建新列并使用给定值填充它们。这是一个示例代码,我是如何做到的。
df <- as.data.frame(1:20)
a <- c(31:50)
b <- c(201:220)
df[c("A","B")] <- c(a, b)
现在问题是我的数据很大(几百万行)并且花费的时间比预期的多,所以我认为有更好的方法。有任何想法吗?谢谢!
答案 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.frame
和data.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及其图形功能的基础知识。