gpt4 book ai didi

r - 对于很少使用统计的程序员,您可以推荐什么软件包?

转载 作者:行者123 更新时间:2023-12-04 10:35:39 25 4
gpt4 key购买 nike

作为一名程序员,我偶尔会发现需要分析大量数据,例如性能日志或内存使用情况数据,而且我总是为做一些我期望更容易的事情需要花费多少时间而感到沮丧。

作为将问题置于上下文中的示例,让我快速向您展示我今天收到的 CSV 文件中的一个示例(为简洁起见,进行了大量过滤):

date,time,PS Eden Space used,PS Old Gen Used, PS Perm Gen Used
2011-06-28,00:00:03,45004472,184177208,94048296
2011-06-28,00:00:18,45292232,184177208,94048296

我有大约 100,000 个这样的数据点,我想在散点图中绘制不同的变量以寻找相关性。通常需要以某种方式处理数据以用于演示目的(例如将纳秒转换为毫秒和舍入小数值),可能需要添加或反转某些列,或组合(如日期/时间列)。

这类工作的通常推荐是 R,我最近认真努力地使用它,但经过几天的工作,我的经验是,大多数我认为很简单的任务似乎需要很多步骤并且有特殊的案例;解决方案通常是非通用的(例如, adding a data set to an existing plot )。它似乎是人们喜爱的语言之一,因为多年来积累的所有强大的库,而不是核心语言的质量和实用性。

不要误会我的意思,我理解 R 对于使用它的人的值(value),只是鉴于我很少花时间在这种事情上,我认为我永远不会成为它的专家,对于非-专家每一项任务都变得太麻烦了。

Microsoft Excel 在可用性方面非常出色,但它的功能不足以处理大型数据集。此外,如果您不小心在过多的数据上绘制了错误的绘图,R 和 Excel 往往会完全卡住(!),除了等待或终止进程之外别无他法。

那么,堆栈溢出,你能推荐一些更适合我的东西吗?我不想放弃并开发自己的工具,我已经有足够的项目了。我喜欢一些交互式的东西,它可以使用硬件加速来进行绘图和/或剔除以避免在渲染上花费太多时间。

最佳答案

@flodin 提供一个用于将此类文件读取到 R 的代码示例对您很有用。我经常使用您提到的大小的数据集,并且没有您提到的问题。如果您不经常使用 R,可能会困扰您的一件事是,如果您不告诉 R R 的列类型是什么,它必须首先对文件进行一些窥探,而这一切都需要时间。看参数colClasses?read.table .

对于您的示例文件,我会这样做:

dat <- read.csv("foo.csv", colClasses = c(rep("character",2), rep("integer", 3)))

然后对 date 进行后期处理和 time变量转换为 R 日期时间对象类,例如 POSIXct ,类似于:
dat <- transform(dat, dateTime = as.POSIXct(paste(date, time)))

例如,让我们读入您的示例数据集,将其复制 50,000 次并将其写出,然后使用 foo 对不同的读入方式进行计时。包含您的数据:
> foo <- read.csv("log.csv")
> foo
date time PS.Eden.Space.used PS.Old.Gen.Used
1 2011-06-28 00:00:03 45004472 184177208
2 2011-06-28 00:00:18 45292232 184177208
PS.Perm.Gen.Used
1 94048296
2 94048296

重复 50000 次:
out <- data.frame(matrix(nrow = nrow(foo) * 50000, ncol = ncol(foo))) 
out[, 1] <- rep(foo[,1], times = 50000)
out[, 2] <- rep(foo[,2], times = 50000)
out[, 3] <- rep(foo[,3], times = 50000)
out[, 4] <- rep(foo[,4], times = 50000)
out[, 5] <- rep(foo[,5], times = 50000)
names(out) <- names(foo)

把它写出来
write.csv(out, file = "bigLog.csv", row.names = FALSE)

时间加载天真的方式和正确的方式:
system.time(in1 <- read.csv("bigLog.csv"))
system.time(in2 <- read.csv("bigLog.csv",
colClasses = c(rep("character",2),
rep("integer", 3))))

这在我普通的笔记本电脑上非常快:
> system.time(in1 <- read.csv("bigLog.csv"))
user system elapsed
0.355 0.008 0.366
> system.time(in2 <- read.csv("bigLog.csv",
colClasses = c(rep("character",2),
rep("integer", 3))))
user system elapsed
0.282 0.003 0.287

对于两种读入方式。

至于绘图,图形可能会有点慢,但是根据您的操作系统,可以通过更改绘图设备来加快速度 - 例如在 Linux 上,不要使用默认值 X11()设备,它使用开罗,而不是尝试没有抗锯齿的旧 X 窗口。此外,您希望在像素不多的图形设备上使用 100,000 个观察值的数据集看到什么?也许尝试重新考虑您的数据分析策略——没有任何统计软件能够让您免于做一些不明智的事情。

听起来好像您正在对完整数据集进行开发代码/分析。在开发新代码或查看数据的新方法时,只使用一小部分数据会更明智,比如使用 1000 行的随机样本,并使用该对象而不是整个数据对象。这样你就可以防止意外地做一些缓慢的事情:
working <- out[sample(nrow(out), 1000), ]

例如。然后使用 working而不是出去。或者,在测试和编写脚本时,设置参数 nrows1000在将数据加载到 R 的调用中(参见 ?read.csv)。这样,在测试时您只读取数据的一个子集,但一个简单的更改将允许您针对完整数据集运行脚本。

对于您所讨论的这种规模的数据集,我认为使用 R 没有任何问题。您的观点,即没有成为使用 R 的足够专家,很可能适用于可能建议的其他脚本语言,例如 python。有一个入门障碍,但如果您想要 Python 或 R 等语言的强大功能,这是可以预料的。一些关键的数据导入/操作,一些绘图和一些简单的分析,掌握这门语言的小子集应该不需要很长时间。

关于r - 对于很少使用统计的程序员,您可以推荐什么软件包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592850/

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