2

我正在尝试创建一个类似于这里的情节:

节奏分布

基本上我想要一个直方图,其中每个 bin 显示在该节奏范围内花费了多长时间(例如 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)))

(rpm) 中的每个值都与(从开始的秒数)d$cadence中的相同索引配对。d$time

这些值不一定是统一的(如果您与 比较可以plot(x=d$time, y=d$cadence, type='l')看出plot(d$cadence, type='l')

如果我做最简单的事情:

hist(d$cadence)

..这会产生非常接近的结果,但是 Y 值是“频率”而不是时间,并且忽略了每个数据点之间的时间(因此特别是 0rpm 段的代表性不足)

4

1 回答 1

2

您需要创建一个新列来说明样本之间的时间。

对于这类事情,我更喜欢 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)")

肯定会有一个更优雅的解决方案,它不会因非整数采样时间而崩溃,但这适用于您的示例数据。

编辑:re:更优雅,更通用的解决方案,您可以使用类似的东西处理非整数采样时间new.d <- aggregate(sample.time~cadence, data=d, FUN=sum),但是问题变成为看起来像频率表但具有非整数频率的东西绘制直方图。经过一番摸索,我得出的结论是,您必须通过将数据进一步聚合到箱中来滚动您自己的直方图,然后用条形图显示它们。

于 2012-07-17T20:18:22.060 回答