我试图在表格中填充一个字段(或者创建一个单独的向量,以较容易的方式),连续数字从1到n,其中n是共享相同因子级别的记录总数,然后回到1为下一个级别,等等。对于像这样的表
data<-matrix(c(rep('A',4),rep('B',3),rep('C',4),rep('D',2)),ncol=1)
结果应该是一个新列(例如&#34; sample&#34;),如下所示:
sample<-c(1,2,3,4,1,2,3,1,2,3,4,1,2)
答案 0 :(得分:2)
sample <- unlist(lapply(rle(data[,1])$lengths,FUN=function(x){1:x}))
data <- cbind(data,sample)
或者甚至更好,您可以将rle
和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"
答案 1 :(得分: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.
答案 2 :(得分:1)
有很多不同的方法可以实现这一目标,但我更喜欢使用ddply()
中的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
答案 3 :(得分:0)
factors <- unique(data)
f1 <- length(which(data == factors[1]))
...
fn <- length(which(data == factors[length(factors)]))
您可以使用for循环或“apply”系列来加速该部分。
然后,
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
答案 4 :(得分:0)
我的回答:
sample <- unlist(lapply(levels(factor(data)), function(x)seq_len(sum(factor(data)==x))))