我如何替换NA值与零在一个R数据框架?

您所在的位置:网站首页 r语言中ncol函数 我如何替换NA值与零在一个R数据框架?

我如何替换NA值与零在一个R数据框架?

2023-03-20 09:00| 来源: 网络整理| 查看: 265

dplyr杂交选项现在比Base R子集重新分配快30%左右。在一个100M的数据帧上mutate_all(~(替换。, is.na(.), 0))比底R快半秒D [is.na(D)] 选择。我们特别要避免的是使用ifelse ()或者一个if_else ().(完整的600个试验分析耗时超过4.5小时,主要原因是包括了这些方法。)请参阅下面的基准分析以获得完整的结果。

如果你正在与海量数据框架作斗争,data.table最快的选项是比标准快40%吗基地R的方法。它还可以修改数据,有效地允许您一次处理近两倍的数据。

其他有用的tidyverse替换方法的集群

区位:

指数mutate_at (c(5:10) ~(替换。, is.na(.), 0)) 直接引用mutate_at (var (var5: var10) ~(替换。, is.na(.), 0)) 固定搭配mutate_at (var(包含(" 1 "))~(替换。, is.na(.), 0)) 或者代替包含(),试着ends_with (),starts_with () 模式匹配mutate_at (var(匹配(\ \ d{2})), ~(替换。, is.na(.), 0))

有条件的:(只改变一种类型,其他类型保持不变。)

整数mutate_if (is.integer ~取代。, is.na(.), 0)) 数字mutate_if(。数字,~(替换。, is.na(.), 0)) 字符串mutate_if(。性格,~(替换。, is.na(.), 0))

完整的分析-针对dplyr 0.8.0更新:函数使用purrr格式~符号:替换已弃用乐趣()参数。

# # #的方法测试:

# Base R: Base .sbst.rssgn

这个分析的代码:

库(微基准)# 20% NA填充的数据帧的1000万行和10列set.seed(42) #重新创建准确的数据帧dfN

###结果总结

> print(perf_results)单位:毫秒expr min lq mean median uq max neval hybrid。Ifelse 6171.0439 6339.7046 6425.221 6407.397 6496.992 7052.851 600 dplyr_if_else 3737.4954 3877.0983 3953.857 3946.024 4023.301 4539.428 600 hybrid。replace_na1497.86531706.1119 1748.464 1745.282 1789.804 2127.166 600 baseR.sbst.rssgn 1480.5098 1686.1581 1730.006 1728.477 1772.951 2010.215 600 baseR.replace 1457.4016 1681.5583 1725.481 1722.069 1766.916 2089.627 600 dplyr_coalesce 1227.6150 1483.3520 1524.245 1519.454 1561.488 1996.859 600 tidyr_replace_na 1248.3292 1473.1707 1521.889 1520.108 1570.382 1995.768 600 hybrd.replace 913.1865 1197.3133 1233.336 1238.747 1276.141 1438.646 600 hybrd.rplc_at.ctn 916.9339 1192.9885 1224.733 1227.628 1268.644 1466.085 600 hybrd.rplc_at.nse 919.0270 1191.0541 1228.749 1228.635 1275.103 2882.040 600 baseR.for 869.3169 1180.8311 1216.958 1224.407 1264.737 1459.726 600 hybrd.rplc_at.idx 839.8915 1189.7465 1223.326 1228.329 1266.375 1565.794 600 DT.for.set.nms 761.6086 915.8166 1015.457 1001.772 1106.315 1363.044 600 DT.for.set.sqln 787.3535 918.8733 1017.812 1002.042 1122.474 1321.860 600

###结果箱线图

ggplot(perf_results, aes(x=expr, y=time/10^9)) + geom_boxplot() + xlab('Expression') + ylab('Elapsed time (Seconds)') + scale_y_continuous(breaks = seq(0,7,1)) + coord_flip()

运行时间的箱线图比较

彩色编码的试验散点图(y轴为对数刻度) qplot(y=time/10^9, data=perf_results, color =expr) + labs(y = "log10每次试验的Scaled Elapsed time (secs)", x = "Trial Number") + ordind_cartesian (ylim =c(0.75, 7.5)) + scale_y_log10(breaks=c(0.75, 0.875, 1,1.25, 1.5, 1.75, seq(2, 7.5)))

所有审判时间的散点图

关于其他表现优秀的人

当数据集变大时,Tidyr”年代replace_na在历史上领先。通过当前收集的100亿个数据点,它的性能几乎完全与基地RFor循环。我很好奇不同大小的数据帧会发生什么。

的其他示例变异而且总结_at而且_all函数变体可以在这里找到:https://rdrr.io/cran/dplyr/man/summarise_all.html此外,我在这里找到了有用的演示和示例集合:https://blog.exploratory.io/dplyr-0-5-is-awesome-heres-why-be095fd4eb8a

归因和欣赏

特别感谢:

泰勒溜冰者而且Akrun用于演示微基准测试。 alexis_laz感谢你帮助我理解本地()以及(在弗兰克耐心的帮助下)无声的胁迫在加速许多这些方法中所起的作用。 ArthurYip为戳添加更新合并()参与并更新分析。 格里高尔的助推来弄清楚data.table函数运行良好,最终将它们包括在阵容中。 基地RFor循环:alexis_laz data.tableFor循环:Matt_Dowle 罗曼用来解释is.numeric ()真正的测试。

(当然,如果你觉得这些方法有用,也请给他们点赞。)

我使用数字的注意事项:如果你有一个纯整数数据集,你所有的函数都将运行得更快。请参阅alexiz_laz的工作获取更多信息。IRL,我不记得遇到过包含超过10-15%整数的数据集,所以我在全数字数据框架上运行这些测试。

硬件使用3.9 GHz CPU, 24 GB内存



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3