我正在使用R中的大型数据表,并尝试遍历整个表并根据单独列中上一行行的值在给定列中设置行值。
我试图在一个有200K行的表上运行这个循环,它的移动速度非常慢。我怀疑我没有利用所有data.table的效率,但不知道我可以改进的地方。
我的代码如下。我的表是“DATA”,我的键是列“x”和“y”,我试图遍历所有行并将第6列中的行值设置为1 仅当时第2列中的行值不等于第2列中前一行的值。
setkey(DATA,x,y)
for (i in 2:nrow(DATA)) {
if (DATA[i,2]!=DATA[i-1,2]){
DATA[i, 6] = 1
}
}
同样,这可行,但对于大型表来说非常慢。任何帮助将不胜感激 - 谢谢!
答案 0 :(得分:6)
没有看到数据,这里是一个刺(不使用data.table
):
DATA[c(0, diff(DATA[,2]))!=0, 6] <- 1
如果第一行被认为是“不相等”:
DATA[c(1, diff(DATA[,2]))!=0, 6] <- 1
答案 1 :(得分:3)
思考向量,而不是循环:
DATA[,6] <- c(0,as.numeric(diff(DATA[,2]) != 0))
我在第一行放了0,因为我不知道还有什么可以放在那里,但如果它更合适,你可以把它改成其他东西。