gpt4 book ai didi

r - 为 R 数据帧中的记录 block 创建序列号

转载 作者:行者123 更新时间:2023-12-04 10:50:19 25 4
gpt4 key购买 nike

我有一个相当大的数据集(按照我的标准),我想为记录块创建一个序列号。我可以使用plyr包,但是执行时间很慢。下面的代码复制了一个类似大小的数据帧。

## simulate an example of the size of a normal data frame
N <- 30000
id <- sample(1:17000, N, replace=T)
term <- as.character(sample(c(9:12), N, replace=T))
date <- sample(seq(as.Date("2012-08-01"), Sys.Date(), by="day"), N, replace=T)
char <- data.frame(matrix(sample(LETTERS, N*50, replace=T), N, 50))
val <- data.frame(matrix(rnorm(N*50), N, 50))
df <- data.frame(id, term, date, char, val, stringsAsFactors=F)
dim(df)

实际上,这比我使用的要小一些,因为这些值通常更大……但这已经足够接近了。

这是我机器上的执行时间:
> system.time(test.plyr <- ddply(df, 
+ .(id, term),
+ summarise,
+ seqnum = 1:length(id),
+ .progress="text"))
|===============================================================================================| 100%
user system elapsed
63.52 0.03 63.85

有一个更好的方法吗?不幸的是,我在 Windows 机器上。

提前致谢。

编辑:Data.table 非常快,但我无法正确计算我的序列号。这是我的 ddply 版本创建的内容。大多数在组中只有一个记录,但有些有 2 行、3 行等。
> with(test.plyr, table(seqnum))
seqnum
1 2 3 4 5
24272 4950 681 88 9

使用如下所示的 data.table,同样的方法产生:
> with(test.dt, table(V1))
V1
1
24272

最佳答案

使用 data.table

dt = data.table(df)
test.dt = dt[,.N,"id,term"]

这是时间比较。我使用 N = 3000 并在生成数据集时用 1700 替换了 17000
f_plyr <- function(){
test.plyr <- ddply(df, .(id, term), summarise, seqnum = 1:length(id),
.progress="text")
}

f_dt <- function(){
dt = data.table(df)
test.dt = dt[,.N,"id,term"]
}

library(rbenchmark)
benchmark(f_plyr(), f_dt(), replications = 10,
columns = c("test", "replications", "elapsed", "relative"))
data.table将事物加速 170 倍
test replications elapsed relative
2 f_dt() 10 0.779 1.000
1 f_plyr() 10 132.572 170.182

另请查看 Hadley 在 dplyr 上的最新作品.如果 dplyr,我不会感到惊讶考虑到大量代码正在用 C 重新编写,因此提供了额外的加速。

更新:编辑代码,更改 length(id).N根据马特的评论。

关于r - 为 R 数据帧中的记录 block 创建序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13418143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com