r - 如何避免大数据集的慢循环?

标签 r dataframe large-data

考虑这个数据集:

> DATA <- data.frame(Agreement_number = c(1,1,1,1,2,2,2,2),
+                    country = c("Canada","Canada", "USA", "USA", "Canada","Canada", "USA", "USA"), 
+                    action = c("signature", "ratification","signature", "ratification", "signature", "ratification","signature", "ratification"), 
+                    signature_date = c(2000,NA,2000,NA, 2001, NA, 2002, NA),
+                    ratification_date = c(NA, 2001, NA, 2002, NA, 2001, NA, 2002))
> DATA
Agreement_number country       action signature_date ratification_date
              1  Canada    signature           2000                NA
             1  Canada ratification             NA              2001
             1     USA    signature           2000                NA
             1     USA ratification             NA              2002
             2  Canada    signature           2001                NA
             2  Canada ratification             NA              2001
             2     USA    signature           2002                NA
             2     USA ratification             NA              2002

如您所见,一半的行包含重复信息。对于像这样的小型数据集,删除重复项非常容易。我可以使用 coalesce 函数(dplyr package),去掉“action”列,然后删除所有不相关的行。不过,还有很多其他的方法。最终结果应如下所示:

> DATA <- data.frame( Agreement_number = c(1,1,2,2),
+                     country = c("Canada", "USA", "Canada","USA"), 
+                     signature_date = c(2000,2000,2001,2002),
+                     ratification_date = c(2001, 2002, 2001, 2002))
> DATA
Agreement_number country signature_date ratification_date
             1  Canada           2000              2001
             1     USA           2000              2002
             2  Canada           2001              2001
             2     USA           2002              2002

问题在于,我的真实数据集要大得多(102000 x 270)并且变量更多。真实数据也更不规则,缺失值也更多。 coalesce 函数似乎很慢。到目前为止,我能做的最好的循环仍然需要 5-10 分钟才能运行。

有没有一种更快的简单方法?我感觉R中一定有这种操作的函数,但是我找不到。

最佳答案

我认为你需要 dcastdata.table 库中的版本自称“快速”,根据我的经验,它在大型数据集上速度很快。

首先,让我们创建一个列,它是 signature_dateratification_date,具体取决于操作

library(data.table)
setDT(DATA)[, date := ifelse(action == "ratification", ratification_date, signature_date)]

现在,让我们对其进行强制转换,以便操作是列,值是日期

wide <- dcast(DATA, Agreement_number + country ~ action, value.var = 'date')

这么宽看起来像这样

  Agreement_number country ratification signature
1                1  Canada         2001      2000
2                1     USA         2002      2000
3                2  Canada         2001      2001
4                2     USA         2002      2002

关于r - 如何避免大数据集的慢循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45427161/

相关文章:

r - R CMD 检查错误 : Packages required but not available

python - 使用一列对值进行分组,并使用 pandas 数据框返回另一列中具有最大值的值

opengl - 处理超过 4GB 纹理 (BigTiff) OpenGL

php - Mysql php - 网络应用程序规模? (大是什么意思?)

r - Cumsum 重置为特定值

r - 融化数据的列算术等价物

r - 如何制作 R session 的日志文件,该文件结合了来自 R 控制台的命令、结果和警告/消息/错误

Python Pandas Group By 错误 'Index' 对象没有属性 'labels'

python - 有没有找到当前单元格值定义的最后一行的最佳方法?

Python 3.6 : Deal with MemoryError