3

標準的な「ループを回避できる」問題がありますが、解決策が見つかりません。

私は@splaisanでこの質問forに答えましたが、中間セクションでいくつかの醜いゆがみに頼らなければなりませんでしたif。誰かがより良い答えを出せることを期待して、ここでより単純なバージョンをシミュレートします...

問題

次のようなデータ構造があるとします。

df <- read.table(text = 'type
a
a
a
b
b
c
c
c
c
d
e', header = TRUE)

同じタイプの連続したチャンクを識別し、それらをグループに分類したいと考えています。最初のチャンクには 0、次のチャンクには 1 というようにラベルを付ける必要があります。チャンクの数は不定であり、各チャンクは 1 つのメンバーだけと同じくらい短い場合があります。

type    label
   a    0
   a    0
   a    0
   b    1
   b    1
   c    2
   c    2
   c    2
   c    2
   d    3
   e    4

私の解決策

forこれを行うにはループに頼らなければなりませんでした。コードは次のとおりです。

label <- 0
df$label <- label

# LOOP through the label column and increment the label
# whenever a new type is found
for (i in 2:length(df$type)) {
    if (df$type[i-1] != df$type[i]) { label <- label + 1 }
    df$label[i] <- label
}

私の質問

ループと条件なしで誰でもこれを行うことができますか?

4

3 に答える 3

6

使用するrle

r <- rle(as.numeric(df$type))
df$label <- rep(seq(from=0, length=length(r$lengths)), times=r$lengths)

rleを使用していませんがcumsum、数値に強制されている論理を使用しています。

df$label <- c(0,cumsum(df$type[-1] != df$type[-length(df$type)]))

両方が与えます:

> df
   type label
1     a     0
2     a     0
3     a     0
4     b     1
5     b     1
6     c     2
7     c     2
8     c     2
9     c     2
10    d     3
11    e     4
于 2012-05-15T22:58:37.977 に答える
3

私のクラック:

as.numeric(df[, 1])-1
于 2012-05-15T23:05:57.623 に答える
2

これは私にも起こりました。単純に因数に変換してから、整数に戻して 1 を引くことができます。

as.integer(as.factor(df$type))-1

typeがすでに要因である場合は、その手順をスキップできます。

于 2012-05-15T23:05:10.573 に答える