R - 改善简单循环的性能

时间:2012-05-21 13:54:52

标签: performance r

我是R的初学者,所以我很难在思考" R方式" ...

我有这个功能:

upOneRow <- function(table, column) {
  for (i in 1:(nrow(table) - 1)) {
    table[i, column] = table [i + 1, column]
  }
  return(table)
}

看起来很简单,并且不应该花那么长的时间来运行,但是在行数约为300k的数据帧上,运行所花费的时间是不合理的。什么是正确的方法来解决这个问题?

3 个答案:

答案 0 :(得分:7)

您可以尝试使用以下内容代替循环:

n <- nrow(table)
table[(1:(n-1)), column] <- table[(2:n), column];

to vectorize是关键

答案 1 :(得分:3)

简单回答:data.frame中的列也是可以用[,]

索引的向量
my.table <- data.frame(x = 1:10, y=10:1)
> my.table
  x y
1 1 5
2 2 4
3 3 3
4 4 2
5 5 1
my.table$y <-c(my.table[-1,"y"],NA) #move up one spot and pad with NA
> my.table
  x  y
1 1  4
2 2  3
3 3  2
4 4  1
5 5 NA

现在,您的函数会在最后重复最后一个数据点。如果这真的是你想要的,请用尾巴(x,1)代替NA。

my.table$y <-c(my.table[-1,"y"],tail(my.table$y,1)) #pad with tail(x,1)
> my.table
  x y
1 1 4
2 2 3
3 3 2
4 4 1
5 5 1

答案 2 :(得分:1)

如果我理解你的话,你就是试图“向上移动”数据框的一列,第一个元素会移到底部。然后,它可能会实现:

col <- table[, column]
table[, column] <- col[c(nrow(table), 1:(nrow(table)-1))]