Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 减少整形的计算时间_Performance_R_Reshape - Fatal编程技术网

Performance 减少整形的计算时间

Performance 减少整形的计算时间,performance,r,reshape,Performance,R,Reshape,我有以下数据集,我想将其从宽格式改为长格式: Name Code CURRENCY 01/01/1980 02/01/1980 03/01/1980 04/01/1980 Abengoa 4256 USD 1.53 1.54 1.51 1.52 Adidas 6783 USD 0.23 0.54 0.61 0.62

我有以下数据集,我想将其从宽格式改为长格式:

Name     Code  CURRENCY   01/01/1980   02/01/1980   03/01/1980   04/01/1980
Abengoa  4256  USD        1.53         1.54         1.51         1.52      
Adidas   6783  USD        0.23         0.54         0.61         0.62      
library(reshape)
data <- read.csv("data.csv")
data1 <- melt(data,id=c("Name","Code", "CURRENCY"),variable_name="Date")
数据包括1980年至2013年期间不同公司每天的股价。因此,我的广域数据中有8612列(大约3000行)。现在,我使用以下命令将数据重塑为长格式:

Name     Code  CURRENCY   01/01/1980   02/01/1980   03/01/1980   04/01/1980
Abengoa  4256  USD        1.53         1.54         1.51         1.52      
Adidas   6783  USD        0.23         0.54         0.61         0.62      
library(reshape)
data <- read.csv("data.csv")
data1 <- melt(data,id=c("Name","Code", "CURRENCY"),variable_name="Date")
库(重塑)
数据基准摘要:
使用
堆栈
(如@AnandaMahto所建议的)肯定是
小数据集的方法(N<3000)。
随着数据集变得越来越大,
data.table
开始优于
stack


下面是一个使用data.table的选项

dtt <- data.table(data)

# non value columns, ie, the columns to keep post reshape
nvc <- c("Name","Code", "CURRENCY")

# name of columns being transformed 
dateCols <- setdiff(names(data), nvc)

# use rbind list to combine subsets
dtt2 <- rbindlist(lapply(dateCols, function(d) {
    dtt[, Date := d]
    cols <- c(nvc, "Date", d)
    setnames(dtt[, cols, with=FALSE], cols, c(nvc, "Date", "value"))
}))

## Results: 

dtt2
#       Name Code CURRENCY         Date value
# 1: Abengoa 4256      USD X_01_01_1980  1.53
# 2:  Adidas 6783      USD X_01_01_1980  0.23
# 3: Abengoa 4256      USD X_02_01_1980  1.54
# 4:  Adidas 6783      USD X_02_01_1980  0.54
# 5: ... <cropped>

<代码> DTT > P>当测试正在进行时,我将把我的评论作为一个答案来给你考虑。尝试使用
堆栈
,如中所示:

data1 <- data.frame(data[1:3], stack(data[-c(1, 2, 3)]))
不过,我对在如此小的数据样本上进行基准测试持谨慎态度,因为我怀疑结果不会与在实际数据集上进行基准测试相当


更新:更多基准的结果 使用@RicardoSaporta的基准测试程序,我对
data.table
与我所称的“Manual”
data.frame
创建进行了基准测试。您可以在这里看到基准测试的结果,数据集范围从1000行到3000行,以500行为增量,所有数据集都有8003列(8000个数据列,加上三个初始列)

结果如下所示:

里卡多是对的——似乎有3000行左右的数据与基本的R方法有着巨大的区别(如果有人能解释这可能是什么,那将是很有趣的)。但是,如果性能确实是主要考虑因素,那么这种“手动”方法实际上比堆栈更快

以下是最近三次运行的结果:

data <- makeSomeData(2000, 8000)
dtt <- data.table(data)
suppressWarnings(benchmark(DT = eval(DT), Manual = eval(Manual), replications = 1, 
    columns = c("relative", "test", "elapsed", "user.self", "sys.self", "replications"), 
    order = "relative"))
##   relative   test elapsed user.self sys.self replications
## 2    1.000 Manual   0.908     0.696    0.108            1
## 1    3.963     DT   3.598     3.564    0.012            1

rm(data, dateCols, nvc, dtt)

data <- makeSomeData(2500, 8000)
dtt <- data.table(data)
suppressWarnings(benchmark(DT = eval(DT), Manual = eval(Manual), replications = 1, 
    columns = c("relative", "test", "elapsed", "user.self", "sys.self", "replications"), 
    order = "relative"))
##   relative   test elapsed user.self sys.self replications
## 2    1.000 Manual   2.841     1.044    0.296            1
## 1    1.694     DT   4.813     4.661    0.080            1

rm(data, dateCols, nvc, dtt)

data <- makeSomeData(3000, 8000)
dtt <- data.table(data)
suppressWarnings(benchmark(DT = eval(DT), Manual = eval(Manual), replications = 1, 
    columns = c("relative", "test", "elapsed", "user.self", "sys.self", "replications"), 
    order = "relative"))
##   relative   test elapsed user.self sys.self replications
## 1     1.00     DT   7.223     5.769    0.112            1
## 2    29.27 Manual 211.416     1.560    0.952            1
问题中的数据:

data <- read.csv("data.csv")

data您可以试试看它是否更快:
data1
restrape2
也应该比
restrape2
快很多。如果你给出一个小的、可复制的例子,人们可能会为你运行基准测试…@BenBolker,非常感谢!我没有意识到我用
restrape
代替
restrape2
的错误。它确实快得多@阿南达马托,这个命令也快得多。我只是在运行这两个版本来测试哪一个更快。@BenBolker,下面是基准测试。然而,也许有一种更有效的方法来实现
重塑2
部分?我想确保基准是一个公平的代表。如果你在这里分享答案和基准,你会得到+1;)虽然我对基准测试了解不多,但我认为您以前的基准测试(在基准测试之前尝试复制更大的数据集)会导致不同的相对时间。如果您有时间,也可以加入我的建议,并在更大的数据集上进行测试。感谢您在这里所做的工作。再说一次,我对基准测试了解不多,但我仍然不敢完全接受这些结果。尝试清除工作区并从头开始运行,但只执行一次复制。我一直认为我提到的第二种选择是最快的,
stack
是第二种选择,
data.table
是第三种选择。我猜这是因为您在data.table中使用了
:=
,这样就不需要在以后的复制中重复特定的步骤了。@AnandaMahto,您是100%正确的。我的工作区里有些东西把结果搞砸了。。现在编辑答案。谢谢你指出这一点!祝你好运我也在想到底发生了什么。(我为我的答案感到骄傲,即使data.table最终排名第一。)期待您的编辑,因为我在这个过程中学习了一些关于基准测试的知识。(但我现在已经过了午夜,我可以称之为一个夜晚。):@AnandaMahto,你的方法很巧妙!对于n3k,data.table,根据您的建议,我创建了一个大型(r)数据集,现在运行基准测试。。我会在完成后发布我喜欢的
data.table
,这是我迄今为止所看到的和做过的一切,但我发现有些信息或警告令人困惑。这里有一条这样的消息()。人们应该从这个信息中解读什么?特别广泛的数据集和
数据是否存在问题。表
?“我能在什么地方读到它吗?”阿南达马托说,这条信息以前从未出现过。您是否使用过函数式的
':='(日期,d)
。如果是这样的话,它可能试图添加与
Date
中的项目一样多的列,然后以令人困惑的方式抱怨。尝试更标准的
DT[,Date:=d]
DT[,Date:=d,with=FALSE]
DT[,':='(Date=d)]
。如果可能提供可复制的示例,那么我将尝试改进/修复警告。我在运行中提供的代码时收到此消息。但是,它仅在代码第一次运行时以及更改
dateSamples@AnandaMahto文件以解决此问题时显示。谢谢你的提醒。@AnandaMahto是的,非常高兴,谢谢你。90%的情况下,询问者不确定这是否是一个bug,所以这是理想的。最重要的是要抓住那些金块,我不介意在哪里。如果需要,我很快就会提交bug/fr并粘贴回链接。这里的代码格式和注释等更好,因此R-Forge跟踪器基本上只是作为链接的任务列表。无论询问者喜欢在哪里发布(SO/datatable help/R-Forge),我们都可以。
data <- read.csv("data.csv")