【问题标题】:Substract last N values from rle() object从 real() 对象中减去最后 N 个值
【发布时间】:2013-03-11 11:02:57
【问题描述】:

以下函数用于为以下数据集创建路径概览:

tc <- textConnection('
path           touchpoint  time
abc             A           1        
abc             A           2        
abc             B           3        
abc             C           4         
def             A           2       
def             B           3       
def             D           4        
def             C           5        
def             D           6 
ghi             A           1
ghi             A           2
ghi             A           3
ghi             C           4
jkl             A           5        
jkl             A           6        
jkl             B           7        
jkl             C           8     
mno             B           1        
mno             A           2        
mno             A           3       
mno             C           4 
pqr             A           1
pqr             C           2
')

paths <- read.table(tc, header=TRUE)

--

library(plyr)

foo <- function(x){
  r <- rle(as.character(x))
  short <- paste0(r$values, collapse="_")
  long  <- paste0(r$values, "(", r$lengths, ")", collapse="_")
  data.frame(short, long)
}

ddply(paths, .(path), function(x)foo(x$touchpoint))

  path                     short                            long
1  abc                     A_B_C                  A(2)_B(1)_C(1)
2  def                 A_B_D_C_D        A(1)_B(1)_D(1)_C(1)_D(1)
3  ghi                       A_C                       A(3)_C(1)
4  jkl                     A_B_C                  A(2)_B(1)_C(1)
5  mno                     B_A_C                  B(1)_A(2)_C(1)
6  pqr                       A_C                       A(1)_C(1)

因此,这个函数创建了两种形式的“路径”:

  • Short 提供从最近到最近的每条路径的接触点序列。
  • Lo​​ng 提供从最近到最近的每条路径的接触点序列,包括涉及接触点的次数。

由于某些路径的接触点数量可能非常大,我想加入以下约束:仅从shortlong 中选择n 的最新值。由于路径是从rle() 对象构造的,我的问题是:

如何从 rle() 对象中获取 N 值及其对应的长度?由于路径是从最近的接触点保存到最近的接触点,因此需要选择最后的N 值和相应的长度。 rle() 文档未提供此问题的解决方案。

N=2 的预期结果是:

  path                     short                            long
1  abc                     B_C                          B(1)_C(1)
2  def                     C_D                          C(1)_D(1)
3  ghi                     A_C                          A(3)_C(1)
4  jkl                     B_C                          B(1)_C(1)
5  mno                     A_C                          A(2)_C(1)
6  pqr                     A_C                          A(1)_C(1)

【问题讨论】:

    标签: r sequence run-length-encoding


    【解决方案1】:

    只取r$valuesr$lengths的最后N个值:

    foo <- function(x,N){
      r <- rle(as.character(x))
      lastN<-max(1,(length(r$lengths) - N + 1)):length(r$lengths)
      short <- paste0(r$values[lastN], collapse="_")
      long  <- paste0(r$values[lastN], "(", r$lengths[lastN], ")", collapse="_")
      data.frame(short, long)
    }
    
    
    ddply(paths, .(path), function(x) foo(x$touchpoint,N=2))
    
      path short      long
    1  abc   B_C B(1)_C(1)
    2  def   C_D C(1)_D(1)
    3  ghi   A_C A(3)_C(1)
    4  jkl   B_C B(1)_C(1)
    5  mno   A_C A(2)_C(1)
    6  pqr   A_C A(1)_C(1)
    
     ddply(paths, .(path), function(x) foo(x$touchpoint,N=4))
      path   short                long
    1  abc   A_B_C      A(2)_B(1)_C(1)
    2  def B_D_C_D B(1)_D(1)_C(1)_D(1)
    3  ghi     A_C           A(3)_C(1)
    4  jkl   A_B_C      A(2)_B(1)_C(1)
    5  mno   B_A_C      B(1)_A(2)_C(1)
    6  pqr     A_C           A(1)_C(1)
    

    编辑:编辑函数以获取最后 N 个值,而不是第一个。

    【讨论】:

    • OP 想要最后 N 个值,而不是第一个 N。
    • 好的,这比预期的要容易。我一直在努力从 rle() 对象中获取值,但这很酷而且效果很好!谢谢!
    • 如果 N > 所选行的长度,这不起作用。例如,如果我设置 N=4,我得到:only 0's may be mixed with negative subscripts
    • @MaxvanderHeijden 好点,我编辑了函数(lastN&lt;-max(1,(length(r$lengths) - N + 1)):length(r$lengths) 行),现在如果长度小于 N,函数会返回所有值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多