【问题标题】:Deconstruct vector by value [duplicate]按值解构向量[重复]
【发布时间】:2018-11-24 14:58:14
【问题描述】:

给定一个部分排序的向量:

A <- c(1,1,1,1,1,0,0,0,0,0,2,2,2,2,2,-1,-1,-1,-1,-1)

目的是将这个向量解构为一个表格,显示不同的值和范围:

 start end value
 1     5       1
 6     10      0
 11    15      2
 16    20     -1

我尝试使用 diff 函数,但似乎找不到将值聚集到所需范围内的好方法。

【问题讨论】:

标签: r


【解决方案1】:

使用rle()(游程编码)

A <- c(1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2,
      -1, -1, -1, -1, -1, 1, 1, 1, 0, 0, 0, 0)
rled <- as.data.frame(unclass(rle(A)))

rled$end <- cumsum(rled$lengths)
rled$start <- rled$end - rled$lengths + 1

rled[, c("start", "end", "values")]


#   start end values
# 1     1   5      1
# 2     6  10      0
# 3    11  15      2
# 4    16  20     -1
# 5    21  23      1
# 6    24  27      0

【讨论】:

    【解决方案2】:

    我们可以从data.table 使用rleid。我们遍历每个唯一的数字,并找到它在原始序列中的第一次和最后一次出现,并将其转换为 data.frame。

    library(data.table) 
    
    indx <- rleid(A)
    new_dat <- data.frame(t(sapply(unique(indx), function(x) {
                               val <- which(indx == x)
                              c(start = min(val), stop = max(val))
    })))
    
    transform(new_dat, value = A[new_dat$start])
    
    
    #  X1 X2 value
    #1  1  5     1
    #2  6 10     0
    #3 11 15     2
    #4 16 20    -1
    

    当数字重复时

    A <- c(1,1,1,1,1,0,0,0,0,0,2,2,2,2,2,-1,-1,-1,-1,-1, 1, 1, 1)
    
    indx <- rleid(A)
    new_dat <- data.frame(t(sapply(unique(indx), function(x) {
                              val <- which(indx == x)
                             c(start = min(val), stop = max(val))
    })))
    
    transform(new_dat, value = A[new_dat$start])
    
    
    #  start stop value
    #1     1    5     1
    #2     6   10     0
    #3    11   15     2
    #4    16   20    -1
    #5    21   23     1
    

    @Henrik 建议的更简洁的data.table 方式

    library(data.table)
    data.table(A)[ , .(from = .I[1], to = .I[.N], val = A[1]), by = rleid(A)][,-1]
    
    
    #   from to val
    #1:    1  5   1
    #2:    6 10   0
    #3:   11 15   2
    #4:   16 20  -1
    #5:   21 23   1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2013-09-12
      • 2020-03-29
      • 1970-01-01
      相关资源
      最近更新 更多