我是R的初学者,所以我很难在思考" R方式" ...
我有这个功能:
upOneRow <- function(table, column) {
for (i in 1:(nrow(table) - 1)) {
table[i, column] = table [i + 1, column]
}
return(table)
}
看起来很简单,并且不应该花那么长的时间来运行,但是在行数约为300k的数据帧上,运行所花费的时间是不合理的。什么是正确的方法来解决这个问题?
答案 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))]