我有一个庞大的数据集,所以我试图找到一种有效的方法。
遍历给定列中的行我想采取特定条件,如果触发我想用当前元素替换上面元素中的值
对于我的代码,条件依赖于元素== 2
[,1] [,2]
[1,] 1 1
[2,] 1 32
[3,] 2 4351
[4,] 2 1
[5,] 3 4
[6,] 4 5
[7,] 5 6546
[8,] 67 456
应该成为
[,1] [,2]
[1,] 1 1
[2,] 1 32
[3,] 1 4351
[4,] 1 1
[5,] 3 4
[6,] 4 5
[7,] 5 6546
[8,] 67 456
但此刻它变成了这一点(请注意,它会同时使用sapply更改所有值,因此连续2个2将使其复制上面的2个)
[,1] [,2]
[1,] 1 1
[2,] 1 32
[3,] 1 4351
[4,] 2 1
[5,] 3 4
[6,] 4 5
[7,] 5 6546
[8,] 67 456
这是我当前的代码,其中包含相同的示例:
rowid = 1
letable = cbind(c(1,3,4,5,67,2,2,1),c(1,4,5,6546,456,4351,1,32))
sortedtable =letable[order(letable[,1]),]
print(sortedtable)
abovefunction <- function(x){
print(paste("this is x",x))
if(x==2){
print(x);
value=sortedtable[rowid-1,1];
print(paste("if ",x));
rowid <<- rowid+1;
print(rowid)
}
else{
print(x);
value = sortedtable[rowid,1];
print(paste("else ",x));
rowid <<- rowid+1;
print(rowid)
}
return(value)
}
sortedcolumn = sapply(sortedtable[,1], abovefunction)
print(sortedcolumn)
有没有办法可以从上到下按顺序执行此功能/替换,而不需要在我的大型数据集上处理非常慢的循环?
答案 0 :(得分:4)
在动物园包中使用na.locf
:
library(zoo)
na.locf(replace(m, m == 2, NA))
,并提供:
[,1] [,2]
[1,] 1 1
[2,] 1 32
[3,] 1 4351
[4,] 1 1
[5,] 3 4
[6,] 4 5
[7,] 5 6546
[8,] 67 456
注意:使用的数据:
m <- structure(c(1L, 1L, 2L, 2L, 3L, 4L, 5L, 67L, 1L, 32L, 4351L,
1L, 4L, 5L, 6546L, 456L), .Dim = c(8L, 2L), .Dimnames = list(
NULL, NULL))
更新修改为使用m
,如图所示。