1

我是 R 的初学者,所以我很难以“R 方式”思考事物......

我有这个功能:

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

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

4

3 回答 3

7

而不是循环,你可以尝试这样的事情:

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

向量化是关键

于 2012-05-21T13:59:43.127 回答
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

现在您的函数在末尾重复最后一个数据点。如果这确实是您想要的,请使用 tail(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
于 2012-05-21T16:20:09.763 回答
1

如果我理解正确,您正在尝试“向上​​移动”数据框的一列,第一个元素位于底部。那么,它可能实现为:

col <- table[, column]
table[, column] <- col[c(nrow(table), 1:(nrow(table)-1))]
于 2012-05-21T16:01:45.970 回答