在 R 中创建累积步骤图
Posted
技术标签:
【中文标题】在 R 中创建累积步骤图【英文标题】:Creating a cumulative step graph in R 【发布时间】:2012-10-17 09:43:38 【问题描述】:假设我有这个示例数据框
set.seed(12345)
n1 <- 3
n2 <- 10
n3 <- 60
times <- seq(0, 100, 0.5)
individual <- c(rep(1, n1),
rep(2, n2),
rep(3, n3))
events <- c(sort(sample(times, n1)),
sort(sample(times, n2)),
sort(sample(times, n3)))
df <- data.frame(individual = individual, events = events)
这给了
> head(df, 10)
individual events
1 1 72.0
2 1 75.5
3 1 87.5
4 2 3.0
5 2 14.5
6 2 16.5
7 2 32.0
8 2 45.5
9 2 50.0
10 2 70.5
我想绘制一个事件的累积步骤图,这样我就可以得到每个人的一条线,每次“遇到”事件时都会增加 1。
因此,例如,个人 1 将是 0 到 72.0,然后上升到 1,直到 75.5 变为 2,然后在 87.5 到图表末尾达到 3。
最简单的方法是什么?
【问题讨论】:
df$counter <- ave(df$individual, df$individual, FUN = seq_along)
有帮助吗?不确定您希望图表的外观如何,但这应该会给您“事件计数”
@vaettchen:是的!
【参考方案1】:
stats 包中还有stepfun
函数。使用它,您可以对该对象类使用plot
方法:
sdf <- split(df, individual)
plot(1, 1, type = "n", xlim = c(0, max(events)), ylim = c(0, max(table(individual))),
ylab = "step", xlab = "time")
sfun <- lapply(sdf, function(x)
sf <- stepfun(sort(x$events), seq_len(nrow(x) + 1) - 1)
plot(sf, add = TRUE, col = unique(x$individual), do.points = FALSE)
)
【讨论】:
【参考方案2】:df$step <- 1
library(plyr)
df <- ddply(df,.(individual),transform,step=cumsum(step))
plot(step~events,data=df[df$individual==1,],type="s",xlim=c(0,max(df$events)),ylim=c(0,max(df$step)),xlab="time",ylab="step")
lines(step~events,data=df[df$individual==2,],type="s",col=2)
lines(step~events,data=df[df$individual==3,],type="s",col=3)
【讨论】:
太棒了!我喜欢基本图形的答案 :) 如果有一种方法可以从 0 开始图表,那将是完美的(我想我可以简单地在开头添加一个 0)。我想我会在unique(df$Individual)
上使用 apply
在一个函数调用中进行绘图。
非常感谢。我不知道type="s"
参数对lines
有效,而且非常少。【参考方案3】:
使用ggplot2
:
library(ggplot2)
# Add step height information with sequence and rle
df$step <- sequence(rle(df$individual)$lengths)
# plot
df$individual <- factor(df$individual)
ggplot(df, aes(x=events, group=individual, colour=individual, y=step)) +
geom_step()
【讨论】:
这正是我想要的。我会等几天再接受这个,看看是否有其他答案(我希望看到使用基本图形的答案)。以上是关于在 R 中创建累积步骤图的主要内容,如果未能解决你的问题,请参考以下文章