第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

R:計(jì)算單個(gè)列中值的連續(xù)出現(xiàn)

R:計(jì)算單個(gè)列中值的連續(xù)出現(xiàn)

慕萊塢森 2019-10-19 15:06:20
我希望在每次運(yùn)行時(shí)都創(chuàng)建一個(gè)相等值的序號(hào),例如出現(xiàn)次數(shù)計(jì)數(shù)器,一旦當(dāng)前行中的值與上一行不同,該序號(hào)就會(huì)重新開(kāi)始。請(qǐng)?jiān)谙旅嬲业捷斎牒皖A(yù)期輸出的示例。dataset <- data.frame(input = c("a","b","b","a","a","c","a","a","a","a","b","c"))dataset$counter <- c(1,1,2,1,2,1,1,2,3,4,1,1)dataset#    input counter# 1      a       1# 2      b       1# 3      b       2# 4      a       1# 5      a       2# 6      c       1# 7      a       1# 8      a       2# 9      a       3# 10     a       4# 11     b       1# 12     c       1我的問(wèn)題與這一問(wèn)題非常相似:值出現(xiàn)的累積順序。
查看完整描述

3 回答

?
揚(yáng)帆大魚(yú)

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊

您需要使用sequence和rle:


> sequence(rle(as.character(dataset$input))$lengths)

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


查看完整回答
反對(duì) 回復(fù) 2019-10-19
?
不負(fù)相思意

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊

而從v1.9.8(新聞項(xiàng)目16),采用rowid與rleid


dataset[, counter := rowid(rleid(input))]

計(jì)時(shí)碼:


set.seed(1L)

library(data.table)

DT <- data.table(input=sample(letters, 1e6, TRUE))

DT1 <- copy(DT)


bench::mark(DT[, counter := seq_len(.N), by=rleid(input)], 

    DT1[, counter := rowid(rleid(input))])

時(shí)間:


  expression                                              min  median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time

  <bch:expr>                                          <bch:t> <bch:t>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm>

1 DT[, `:=`(counter, seq_len(.N)), by = rleid(input)] 613.8ms 613.8ms      1.63    18.8MB     8.15     1     5      614ms

2 DT1[, `:=`(counter, rowid(rleid(input)))]            60.5ms  71.4ms     12.7     26.4MB    14.5      7     8      553ms

現(xiàn)在可以在名為的data.table程序包中獲得下面編寫的函數(shù)的高效且更直接的版本rleid。使用它,就是:


setDT(dataset)[, counter := seq_len(.N), by=rleid(input)]

有關(guān)?rleid更多用法和示例,請(qǐng)參見(jiàn)。感謝@Henrik提出的更新此帖子的建議。


rle絕對(duì)是最方便的方法(+1 @Ananda)。但是,在更大的數(shù)據(jù)上,可以做得更好(就速度而言)。您可以按以下方式使用duplist和vecseq函數(shù)(未導(dǎo)出)data.table:


require(data.table)

arun <- function(y) {

    w = data.table:::duplist(list(y))

    w = c(diff(w), length(y)-tail(w,1L)+1L)

    data.table:::vecseq(rep(1L, length(w)), w, length(y))

}


x <- c("a","b","b","a","a","c","a","a","a","a","b","c")

arun(x)

# [1] 1 1 2 1 2 1 1 2 3 4 1 1

大數(shù)據(jù)基準(zhǔn)測(cè)試:


set.seed(1)

x <- sample(letters, 1e6, TRUE)

# rle solution

ananda <- function(y) {

    sequence(rle(y)$lengths)

}


require(microbenchmark)

microbenchmark(a1 <- arun(x), a2<-ananda(x), times=100)

Unit: milliseconds

            expr       min        lq    median       uq       max neval

   a1 <- arun(x)  123.2827  132.6777  163.3844  185.439  563.5825   100

 a2 <- ananda(x) 1382.1752 1899.2517 2066.4185 2247.233 3764.0040   100


identical(a1, a2) # [1] TRUE


查看完整回答
反對(duì) 回復(fù) 2019-10-19
?
蝴蝶不菲

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊

包亞軍有專門的解決方案來(lái)計(jì)算需要什么。streak_run是最快的解決方案,接受向量作為輸入。


library(microbenchmark); library(runner)


x      <- sample(letters, 1e6, TRUE)

ananda <- function(y) sequence(rle(y)$lengths)


microbenchmark( a2<-ananda(x), runner <- streak_run(x), times=100)


#Unit: milliseconds

#                expr     min      lq     mean  median       uq      max neval

#     a2 <- ananda(x) 580.744 718.117 1059.676 944.073 1399.649 1699.293    10

#run <- streak_run(x)  37.682  39.568   42.277  40.591   43.947   52.917    10


identical(a2, run)

#[1] TRUE


查看完整回答
反對(duì) 回復(fù) 2019-10-19
  • 3 回答
  • 0 關(guān)注
  • 748 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)