【问题标题】:Assigning vector elements a value associated with preceding matching value [duplicate]为向量元素分配与先前匹配值关联的值[重复]
【发布时间】:2019-11-21 07:22:00
【问题描述】:

我有一个交替 TRUEFALSE 值的向量:

dat <- c(T,F,F,T,F,F,F,T,F,T,F,F,F,F)

我想用唯一的序列号为TRUE 的每个实例编号,并为每个FALSE 值分配与其前面的TRUE 值关联的编号。

因此,我希望使用上面的示例 dat 输出(它有 4 个 TRUE 值):

1 1 1 2 2 2 2 3 3 4 4 4 4 4 

我尝试了什么

我尝试了以下方法(可行),但我知道必须有一个更简单的解决方案!

whichT <- which(dat==T)
whichF <- which(dat==F)

l1 <- lapply(1:length(whichT),
  FUN = function(x) 
    which(whichF > whichT[x] & whichF < whichT[(x+1)]) 
)

l1[[length(l1)]] <- which(whichF > whichT[length(whichT)])

replaceFs <- unlist(
  lapply(1:length(whichT), 
    function(x) l1[[x]] <- rep(x,length(l1[[x]]))
  )
)

replaceTs <- 1:length(whichT)

dat2 <- dat
  dat2[whichT] <- replaceTs
  dat2[whichF] <- replaceFs

dat2
 [1] 1 1 1 2 2 2 2 3 3 4 4 4 4 4

我需要一个更简单、更快捷的解决方案,因为我的真实数据集有 181k 行!

首选 Base R 解决方案,但任何解决方案都有效

【问题讨论】:

    标签: r vector match apply


    【解决方案1】:

    cumsum(dat) 会做你想做的事。在数学函数中使用时,TRUE 会被转换为 1,FALSE 会被转换为 0,因此每次看到 TRUE 时,求和将加 1,而当出现 FALSE 时,则什么也不加。

    dat <- c(T,F,F,T,F,F,F,T,F,T,F,F,F,F)
    cumsum(dat)
    # [1] 1 1 1 2 2 2 2 3 3 4 4 4 4 4
    

    【讨论】:

      【解决方案2】:

      可以使用来自base Rcumsum 轻松完成,而不是进行索引。在这里,TRUE/FALSE 被强制为 1/0,当我们进行累积和时,无论哪里有 1,它都会增加 1

      cumsum(dat)
      #[1] 1 1 1 2 2 2 2 3 3 4 4 4 4 4
      

      【讨论】:

        【解决方案3】:

        cumsum() 是最直接的方式,但是您也可以这样做:

        Reduce("+", dat, accumulate = TRUE)
        
         [1] 1 1 1 2 2 2 2 3 3 4 4 4 4 4
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-23
          • 1970-01-01
          • 2020-05-27
          • 2014-08-19
          • 1970-01-01
          • 2014-02-02
          相关资源
          最近更新 更多