我正在使用 R 对 Wikidata 转储进行分析。我之前已经从 XML 转储中提取了我需要的变量,并在较小的 csv 文件中创建了我自己的数据集。这是我的文件的样子。
Q939818;35199259;2013-05-04T20:28:48Z;KLBot2;/* wbcreateclaim-create:2| */ [[Property:P373]], Tour de Pologne 2010
Q939818;72643278;2013-09-26T03:46:26Z;Coyau;/* wbcreateclaim-create:1| */[[Property:P107]]: [[Q1656682]]
Q939818;72643283;2013-09-26T03:46:28Z;Coyau;/* wbcreateclaim-create:1| */[[Property:P31]]: [[Q2215841]]
Q939818;90117273;2013-11-28T14:14:04Z;DanmicholoBot;/* wbsetlabel-add:1|nb */from the [no] label
Q939818;90117281;2013-11-28T14:14:07Z;DanmicholoBot;/* wbsetlabel-remove:1|no */
Q939818;92928394;2013-11-28T14:14:07Z;DanmicholoBot;/* wbsetlabel-remove:1|no */
不幸的是,提取变量的脚本有时会跳过一些标签,因此在某些行中,项目 ID(第一个值)不存在,它被“wikimedia page”替换。
我想通过检查第三列中的时间来推断缺少的项目 ID:如果缺少值的行中的时间在下一个之前,那么我可以假设项目 ID 是相同的(它们是两个相同值的修订版)。否则,项目 ID 将与上一行相同。
为此,我编写了一些代码,首先检查第一列中带有“wikimedia page”的所有行,然后执行我刚刚描述的操作:
wikimedia_lines <- grep("wikimedia page", wikiedits_clean$V1)
for (i in wikimedia_lines){
if (wikiedits_clean$time[i] < wikiedits_clean$time[i + 1]) {
wikiedits_clean$V1[i] <- wikiedits_clean$V1[i + 1]
}
else {wikiedits_clean$V1[i] <- wikiedits_clean$V1[i - 1] }
}
但是,由于我的文件很大(约 650 万行),因此执行循环需要很长时间。是否有更多“R 风格”(如使用 apply 或 sapply)解决方案可以更有效地做到这一点?
谢谢你。