按组

时间:2015-10-22 16:21:18

标签: r

我试图按组对数据行进行编号,这是我多次做过的事情。但是,这次我得到了一个错误。最终我意识到错误显然是因为每组中的行数是相同的。为什么会导致错误?

此代码有效:

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

虽然,我仍然试图弄清楚如何在第二种情况下以相反的顺序对行进行编号。

1 个答案:

答案 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