考虑这个数据集:
> 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中一定有这种操作的函数,但是我找不到。
最佳答案
我认为你需要 dcast
。 data.table
库中的版本自称“快速”,根据我的经验,它在大型数据集上速度很快。
首先,让我们创建一个列,它是 signature_date
或 ratification_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/