我有一个类似于以下数据框的数据,但是有55,000个观测值和大约50,000个组:
d <- structure(list(a = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 3L), .Label = c("A",
"B", "C"), class = "factor"), b = c(1, 1, 2, 1, 2, 1, 2)), .Names = c("a",
"b"), row.names = c(1L, 3L, 2L, 4L, 5L, 6L, 7L), class = "data.frame")
由于在这个数据框中,每个组又根据变量"b"排序。我现在想根据分组变量"a"拆分数据框,并添加一个向量,指示每个子数据框中每个元素的排序号码。因此,结果应该如下所示:
structure(list(a = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 3L), .Label = c("A",
"B", "C"), class = "factor"), b = c(1, 2, 1, 1, 2, 1, 2), order = c(1,
2, 3, 1, 2, 1, 2)), .Names = c("a", "b", "order"), row.names = c("1",
"2", "3", "4", "5", "6", "7"), class = "data.frame")
使用split()函数和我的自定义gmark()函数,我能够在测试数据框上得到这个结果(gmark()假设输入已经排序):
gmark <- function(input){
x = 0
result = vector()
for(i in input){
x <- x+1
result <- append(result, x)
}
result
}
x <- split(d, d$a)
x <- lapply(x, function(x){cbind(x, order = gmark(x$b))})
x <- unsplit(x, a)
然而,一旦我将此应用于更大的数据框时,split()的速度会变得非常缓慢,并且无法返回结果。有没有更高效的方法在更大的数据框上获得这个结果?
result
将是一个长度为50k的向量,那么将其初始化为确切大小的数字向量将使for
循环更快。例如,使用result <- numeric(5e4)
而不是result <- vector()
进行初始化。 - Rich Scriventa <- as.character(d$a); unlist(sapply(rle(ta)$lengths,seq.int))
? - Bhas