根据条件使用前一行替换值(使用sapply等函数)

时间:2014-06-02 13:57:31

标签: r dataset apply sapply

我有一个庞大的数据集,所以我试图找到一种有效的方法。

遍历给定列中的行我想采取特定条件,如果触发我想用当前元素替换上面元素中的值

对于我的代码,条件依赖于元素== 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)

有没有办法可以从上到下按顺序执行此功能/替换,而不需要在我的大型数据集上处理非常慢的循环?

1 个答案:

答案 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,如图所示。