【问题标题】:R - Split numeric vector into intervalsR - 将数值向量拆分为区间
【发布时间】:2015-07-08 11:20:55
【问题描述】:

我有一个关于向量“拆分”的问题,尽管不同的方法可能是可行的。我有一个 data.frame(df) 看起来像这样(简化版):

   case time
1   1   5
2   2   3
3   3   4

“时间”变量计算时间单位(天、周等),直到事件发生。我想通过增加行数来扩展数据集,并将“时间”“拆分”为长度为 1 的间隔,从 2 开始。结果可能如下所示:

    case    time    begin   end
1   1       5       2       3
2   1       5       3       4
3   1       5       4       5
4   2       3       2       3
5   3       4       2       3
6   3       4       3       4

显然,我的数据集比这个例子要大一些。实现这一结果的可行方法是什么?

我有一个开始的想法

df.exp <- df[rep(row.names(df), df$time - 2), 1:2]

为了扩大每个案例的行数,根据时间间隔的数量。基于此,可以按以下方式添加“开始”和“结束”列:

df.exp$begin <- 2:(df.exp$time-1)

但是,我没有成功创建相应的列,因为该命令仅使用第一行来计算 (df.exp$time-1),并且不会自动按“大小写”进行区分。

任何想法都将不胜感激!

【问题讨论】:

  • 我不明白第 5 行的结果。
  • 第 5 行的结果来自观察到给出了一个新案例。每个新案例都以间隔 begin=2, end=3 开始。之后,会出现更多长度为 1 的区间,具体取决于“时间”变量。

标签: r time split intervals


【解决方案1】:

你可以试试

df2 <- df1[rep(1:nrow(df1), df1$time-2),]
row.names(df2) <- NULL
m1 <- do.call(rbind,
          Map(function(x,y) {
                  v1 <- seq(x,y)
                  cbind(v1[-length(v1)],v1[-1L])},
                  2, df1$time))
df2[c('begin', 'end')] <- m1
df2
#  case time begin end
#1    1    5     2   3
#2    1    5     3   4
#3    1    5     4   5
#4    2    3     2   3
#5    3    4     2   3
#6    3    4     3   4

或者data.table的选项

library(data.table)
setDT(df1)[,{tmp <- seq(2, time)
               list(time= time,
                    begin= tmp[-length(tmp)],
                    end=tmp[-1])} , by = case]
#   case time begin end
#1:    1    5     2   3
#2:    1    5     3   4
#3:    1    5     4   5
#4:    2    3     2   3
#5:    3    4     2   3
#6:    3    4     3   4

【讨论】:

    【解决方案2】:
    library(data.table)
    DT <- as.data.table(df)
    DT[, rep(time, time-2), case][, begin := 2:(.N+1), case][, end := begin +1][]
    #   case V1 begin end
    #1:    1  5     2   3
    #2:    1  5     3   4
    #3:    1  5     4   5
    #4:    2  3     2   3
    #5:    3  4     2   3
    #6:    3  4     3   4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2012-04-06
      相关资源
      最近更新 更多