我试图按组对数据行进行编号,这是我多次做过的事情。但是,这次我得到了一个错误。最终我意识到错误显然是因为每组中的行数是相同的。为什么会导致错误?
此代码有效:
my.data <- read.table(text = '
refno cov1 cov2
1111 a 1
2222 b -2
3333 c 3
4444 d 4
5555 a 1
6666 b 2
7777 c 3
', header = TRUE, stringsAsFactors = FALSE)
# duplicate rows
n.times <- c(2,3,2,2,2,2,2)
my.data2 <- my.data[rep(seq_len(nrow(my.data)), n.times),]
# number rows by refno
my.seq <- data.frame(rle(my.data2$refno)$lengths)
my.data2$first <- unlist(apply(my.seq, 1, function(x) seq(1,x)))
my.data2$last <- unlist(apply(my.seq, 1, function(x) seq(x,1,-1)))
my.data2
但是,此代码不起作用。唯一的区别是我将3
中的n.times <- c(2,3,2,2,2,2,2)
更改为2
。
my.data <- read.table(text = '
refno cov1 cov2
1111 a 1
2222 b -2
3333 c 3
4444 d 4
5555 a 1
6666 b 2
7777 c 3
', header = TRUE, stringsAsFactors = FALSE)
# duplicate rows
n.times <- c(2,2,2,2,2,2,2)
my.data2 <- my.data[rep(seq_len(nrow(my.data)), n.times),]
# number rows by refno
my.seq <- data.frame(rle(my.data2$refno)$lengths)
my.data2$first <- unlist(apply(my.seq, 1, function(x) seq(1,x)))
my.data2$last <- unlist(apply(my.seq, 1, function(x) seq(x,1,-1)))
my.data2
我想我可以使用这里的方法在第二种情况下对行进行编号:Sequentially numbering many rows blocks of unequal length
虽然,我仍然试图弄清楚如何在第二种情况下以相反的顺序对行进行编号。
答案 0 :(得分:1)
当你拥有所有2时,apply
返回一个数组而不是一个列表。这是因为如果对apply
的每次调用都是长度为FUN
的向量,则n
会返回一个数组。但是,这在过去对您有用,因为您对apply
的调用返回了不同长度的向量。在这种情况下,apply
将返回一个列表。
请参阅VALUE
https://stat.ethz.ch/R-manual/R-patched/library/base/html/apply.html
apply
部分
您可以使用lapply
的返回值rle
来解决此问题。
my.seq <- rle(my.data2$refno)$lengths
my.data2$first <- unlist(lapply(my.seq, function(x) seq(1,x)))
my.data2$last <- unlist(lapply(my.seq, function(x) seq(x,1,-1)))
my.data2
refno cov1 cov2 first last
1 1111 a 1 1 2
1.1 1111 a 1 2 1
2 2222 b -2 1 2
2.1 2222 b -2 2 1
3 3333 c 3 1 2
3.1 3333 c 3 2 1
4 4444 d 4 1 2
4.1 4444 d 4 2 1
5 5555 a 1 1 2
5.1 5555 a 1 2 1
6 6666 b 2 1 2
6.1 6666 b 2 2 1
7 7777 c 3 1 2
7.1 7777 c 3 2 1