5

カット機能に問題があります。私はこの状況を持っています:

 codice
1 11GP2-0016
2 11GP2-0016
3 11GP2-0016
4  11OL2-074
5  11OL2-074    

そして、次のように、新しい変数「カンピオーネ」を変数「コード」で分割したいと思います。

    codice campione
1 11GP2-0016    [1,3]
2 11GP2-0016    [1,3]
3 11GP2-0016    [1,3]
4  11OL2-074    (4,5]
5  11OL2-074    (4,5]

カット機能を使用して「コード」を分割し、1 から 3 までは同じコード、4 から 5 までは同じコードなどを示す変数を作成するにはどうすればよいですか?

別の問題を解決する必要があります。同じ問題について、取得したいのは次のとおりです。

 codice campione
1 11GP2-0016    [11GP2-0016,11GP2-0016,11GP2-0016]
2 11GP2-0016    [11GP2-0016,11GP2-0016,11GP2-0016]
3 11GP2-0016    [11GP2-0016,11GP2-0016,11GP2-0016]
4  11OL2-074    (11OL2-074,11OL2-074]
5  11OL2-074    (11OL2-074,11OL2-074]

これを行う解決策はありますか?

4

3 に答える 3

3

これでできます。必要に応じて、括弧/括弧を追加できます。

dat <- read.table(text='codice
1 11GP2-0016
2 11GP2-0016
3 11GP2-0016
4  11OL2-074
5  11OL2-074', header=TRUE)

within(dat, 
    campione <- with(rle(as.character(codice)), {
        starts <- which(! duplicated(codice))
        ends <- starts + lengths - 1
        inverse.rle(list(values=paste(starts, ends, sep=','), lengths=lengths))
    })
)

#       codice campione
# 1 11GP2-0016      1,3
# 2 11GP2-0016      1,3
# 3 11GP2-0016      1,3
# 4  11OL2-074      4,5
# 5  11OL2-074      4,5       
于 2012-10-18T15:57:47.027 に答える
3

データの使用:

d <- read.table(text = "1 11GP2-0016
2 11GP2-0016
3 11GP2-0016
4  11OL2-074
5  11OL2-074", row.names = 1, stringsAsFactors = FALSE)
names(d) <- "codice"

を使用した少し複雑な例を次に示しrle()ます。

drle <- with(d, rle(codice))

これにより、 のランレングスが得られますcodice

> drle
Run Length Encoding
  lengths: int [1:2] 3 2
  values : chr [1:2] "11GP2-0016" "11OL2-074"

これは、開始 ( ) と終了 ( )$lengthsの 2 つの指示を作成するために操作するコンポーネントです。ind1ind2

ind1 <- with(drle, rep(seq_along(lengths), times = lengths) +
                     rep(c(0, head(lengths, -1) - 1), times = lengths))
ind2 <- ind1 + with(drle, rep(lengths- 1, times = lengths))

次に、これらを貼り付けます。

d <- transform(d, campione = paste0("[", ind1, ",", ind2, "]"))

与える

> head(d)
      codice campione
1 11GP2-0016    [1,3]
2 11GP2-0016    [1,3]
3 11GP2-0016    [1,3]
4  11OL2-074    [4,5]
5  11OL2-074    [4,5]
于 2012-10-18T15:51:30.207 に答える
2

別のアプローチは、次を使用することrankです。

left <- rank(factor(d$codice), ties.method = "min")
right <- rank(factor(d$codice), ties.method = "max")
d$campione <- paste("[", left, ",", right, "]", sep = "")
于 2012-10-18T22:46:12.683 に答える