2

テーブル内のフィールドに 1 から n までの連続した数値を入力しようとしています (または別のベクトルを作成する、どちらか簡単な方)。ここで、n は同じ因子レベルを共有するレコードの総数であり、その後 1 に戻ります。次のレベルなど。つまり、このようなテーブルの場合

data<-matrix(c(rep('A',4),rep('B',3),rep('C',4),rep('D',2)),ncol=1)

結果は、次のように新しい列 (例: "sample") になります。

sample<-c(1,2,3,4,1,2,3,1,2,3,4,1,2)
4

5 に答える 5

2

rle次の関数と一緒に使用できますlapply

sample <- unlist(lapply(rle(data[,1])$lengths,FUN=function(x){1:x}))

data <- cbind(data,sample)

rleまたはさらに良いことに、次のワンライナーでandを組み合わせることができますsequence(@Arun の提案に感謝)

data <- cbind(data,sequence(rle(data[,1])$lengths))

> data
      [,1] [,2]
 [1,] "A"  "1" 
 [2,] "A"  "2" 
 [3,] "A"  "3" 
 [4,] "A"  "4" 
 [5,] "B"  "1" 
 [6,] "B"  "2" 
 [7,] "B"  "3" 
 [8,] "C"  "1" 
 [9,] "C"  "2" 
[10,] "C"  "3" 
[11,] "C"  "4" 
[12,] "D"  "1" 
[13,] "D"  "2" 
于 2013-07-29T12:40:28.530 に答える
2

を使用して、次のように取得できますave

data <- data.frame(data)
new <- ave(rep(1,nrow(data)),data$data,FUN=cumsum)
all.equal(new,sample) # check if it's right.
于 2013-07-29T12:43:33.690 に答える
1

これを実現するにはさまざまな方法がありますが、ロジックが非常に一貫しているように見えるため、ddply()fromを使用することを好みます。plyrで作業する方が理にかなっていると思いますdata.frame(あなたのタイトルは因子のレベルについて語っています):

dat <- data.frame(ID = c(rep('A',4),rep('B',3),rep('C',4),rep('D',2)))
library(plyr)
ddply(dat, .(ID), summarise, sample = 1:length(ID))
#    ID sample
# 1   A      1
# 2   A      2
# 3   A      3
# 4   A      4
# 5   B      1
# 6   B      2
# 7   B      3
# 8   C      1
# 9   C      2
# 10  C      3
# 11  C      4
# 12  D      1
# 13  D      2
于 2013-07-29T12:41:30.353 に答える
0
    factors <- unique(data)
    f1 <- length(which(data == factors[1]))
    ...
    fn <- length(which(data == factors[length(factors)]))

for ループまたは「適用」ファミリを使用して、その部分を高速化できます。

それで、

    sample <- c(1:f1, 1:f2, ..., 1:fn)

ここでも、その部分に for ループを使用できます。使用できる完全なスクリプトは次のとおりです。

    data<-matrix(c(rep('A',4),rep('B',3),rep('C',4),rep('D',2)),ncol=1)

    factors <- unique(data)
    f <- c()

    for(i in 1:length(factors)) {
      f[i] <- length(which(data == factors[i]))
    }

    sample <- c()

   for(i in 1:length(f)) {
      sample <- c(sample, 1:f[i])
    }

    > sample
     [1] 1 2 3 4 1 2 3 1 2 3 4 1 2
于 2013-07-29T12:37:28.067 に答える
0

私の答え:

sample <- unlist(lapply(levels(factor(data)), function(x)seq_len(sum(factor(data)==x))))
于 2013-07-29T12:42:20.133 に答える