我正在尝试创建类似于 the ones here 的情节:
基本上我想要一个直方图,其中每个箱显示在该节奏范围内花费了多长时间(例如 0-20rpm 下 1 小时,21-40rpm 下 3 小时等)
library("rjson") # 3rd party library, so: install.packages("rjson")
# Load data from Strava API.
# Ride used for example is http://app.strava.com/rides/13542320
url <- "http://app.strava.com/api/v1/streams/13542320?streams[]=cadence,time"
d <- fromJSON(paste(readLines(url)))
d$cadence
(rpm) 中的每个值都与 d$time
(从开始算起的秒数)中的相同索引配对。
这些值不一定是统一的(如果将 plot(x=d$time, y=d$cadence, type='l')
与 plot( d$节奏, type='l')
)
如果我做最简单的事情:
hist(d$cadence)
..这会产生非常接近的结果,但 Y 值是“频率”而不是时间,并且忽略每个数据点之间的时间(因此特别是 0rpm 段将被低估)
最佳答案
您需要创建一个新列来考虑样本之间的时间。
对于这类事情,我更喜欢 data.frames 而不是列表,所以:
d <- as.data.frame(fromJSON(paste(readLines(url))))
d$sample.time <- 0
d$sample.time[2:nrow(d)] <- d$time[2:nrow(d)]-d$time[1:(nrow(d)-1)]
现在您已经获得了采样时间,您可以简单地“重复”采样时间超过 1 的任何内容的节奏测量,并绘制其直方图
hist(rep(x=d$cadence, times=d$sample.time),
main="Histogram of Cadence", xlab="Cadence (RPM)",
ylab="Time (presumably seconds)")
肯定会有一个更优雅的解决方案,不会因非整数采样时间而崩溃,但这适用于您的示例数据。
编辑:回复:更优雅、更通用的解决方案,您可以使用类似 new.d <- aggregate(sample.time~cadence, data=d, FUN=sum)
来处理非整数采样时间。 ,但问题就变成了为看起来像频率表但具有非整数频率的东西绘制直方图。经过一番摸索后,我得出的结论是,您必须通过进一步将数据聚合到箱中,然后用条形图显示它们来为这种情况滚动您自己的直方图。
关于R 直方图显示每个 bin 所花费的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529146/