我正在尝试创建类似于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$cadence, type='l')
进行比较,可以看到)
如果我做最简单的事情:
hist(d$cadence)
..这会产生非常接近的东西,但Y值是“频率”而不是时间,并且忽略每个数据点之间的时间(因此0rpm段特别是代表不足)
答案 0 :(得分: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)
之类的东西来处理非整数采样时间,但是问题会变成直方图,看起来像频率表,但是具有非整数频率。经过一番探讨之后,我得出结论,你必须通过进一步将数据汇总到箱子中,然后用条形图显示它们来为这种情况滚动自己的直方图。