高效vapply与全局分配

时间:2018-06-20 19:14:40

标签: r

我有以下示例的数据,其中包含多个类别变量和一个连续变量。我想为分类变量的每个分组在连续变量中找到记录的最后一个实例,然后将其作为新列添加到数据集中。我的数据集有两百万行,我试图找出是否有人拥有更有效的方法。我正在使用apply而不是循环,但是它仍然很慢。预先感谢。

可复制的示例:

require(tidyr)
data(iris)

g.iris <- gather(iris, key=key, value=value, -Species)
g.iris$time <- rep(1:50, 12)

index.vector <- paste(g.iris$Species, g.iris$key, sep=" - ")
index.vector <- index.vector[!duplicated(index.vector)]

vapply(index.vector, FUN.VALUE=numeric(1), function(x) {

group <- g.iris[g.iris$Species == gsub("(^.+)( - )(.+$)", "\\1", x) &
                    g.iris$key == gsub("(^.+)( - )(.+$)", "\\3", x), ]

value <- group[max(group$time), "value"]

g.iris[g.iris$Species == group$Species &
       g.iris$key == group$key, "last.value"] <<- value

})

1 个答案:

答案 0 :(得分:2)

一个简单的int main(int argc, const char * argv[]) { @autoreleasepool { NSArray *nums = @[@(1), @(2), @(3)]; NSLog(@"%@", [nums valueForKeyPath:@"@sum.self"]); } return 0; } 命令

dplyr

似乎要返回与您的代码相同的内容,但根本不会打扰xx <- g.iris %>% group_by(Species, key) %>% mutate(last.value=value[which.max(time)]) 部分。

index.vector