【问题标题】:Creating a cumulative step graph in R在 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 &lt;- ave(df$individual, df$individual, FUN = seq_along) 有帮助吗?不确定您希望图表的外观如何,但这应该会给您“事件计数”
  • @vaettchen:是的!

标签: r graph cumulative-sum


【解决方案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()
    

    【讨论】:

    • 这正是我想要的。我会等几天再接受这个,看看是否有其他答案(我希望看到使用基本图形的答案)。
    猜你喜欢
    • 2016-11-24
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多