gpt4 book ai didi

r - R中的快速子集

转载 作者:行者123 更新时间:2023-12-04 09:02:55 29 4
gpt4 key购买 nike

我有一个大小为 30000 x 50 的数据帧数据。我还有一个单独的列表,其中包含指向该数据帧中行分组的点,例如,

rows <- list(c("34", "36", "39"), c("45", "46"))

这表示具有 rownames (不是数字行 indeces,而是字符 rownames(dat))“34”、“36”、“39”的数据帧行构成一个分组,而“45”、“46”构成另一个分组。

现在我想将数据帧中的分组提取到一个并行列表中,但是我的代码(如下)非常非常慢。我怎样才能加快速度?
> system.time(lapply(rows, function(r) {dat[r, ]}))
user system elapsed
246.09 0.01 247.23

这是在速度非常快的计算机上,R 2.14.1 x64。

最佳答案

主要问题之一是行名称的匹配——[.data.frame 中的默认值是行名称的部分匹配,您可能不希望这样,所以最好使用 match .要进一步加快速度,您可以使用 fmatch来自 fastmatch如果你想。这是一个带有一些加速的小修改:

# naive
> system.time(res1 <- lapply(rows,function(r) dat[r,]))
user system elapsed
69.207 5.545 74.787

# match
> rn <- rownames(dat)
> system.time(res1 <- lapply(rows,function(r) dat[match(r,rn),]))
user system elapsed
36.810 10.003 47.082

# fastmatch
> rn <- rownames(dat)
> system.time(res1 <- lapply(rows,function(r) dat[fmatch(r,rn),]))
user system elapsed
19.145 3.012 22.226

不使用 [ 可以进一步加快速度(数据帧很慢)但如果您的 split 拆分数据帧(使用 rows )不重叠并覆盖所有行(因此您可以将每一行映射到行中的一个条目)。

根据您的实际数据,使用具有更快子集运算符的矩阵可能会更好,因为它们是原生的。

关于r - R中的快速子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8936525/

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