如何使用矢量化而不是循环来优化我的R代码以消除数据帧中的NEIGHBORING重复行

时间:2014-10-31 09:07:50

标签: r optimization dataframe

编辑问题:

我的数据框看起来像这样。

x1 <- c("a", "c", "f", "j")
x2 <- c("b", "c", "g", "k")
x3 <- c("b", "d", "h", NA)
x4 <- c("a", "e", "i", NA)
df <- data.frame(x1, x2, x3, x4, stringsAsFactors=F)

df

  x1 x2   x3   x4
1  a  b    b    a
2  c  c    d    e
3  f  g    h    i
4  j  k <NA> <NA>

我写了一个循环来消除每行中的NEIGHBORING重复值。

for ( i in 1:4 ) {

   for ( j in 1:3 ) {

     if ( df[i, 4-j+1] == df[i, 4-j] & is.na(df[i, 4-j+1]) == F ) {

       df[i, 4-j+1] <- NA

     } else { 

       df[i, 4-j+1] <- df[i, 4-j+1]
     }
   }
}

结果如下所示。

  x1   x2   x3   x4
1  a    b <NA>    a
2  c <NA>    d    e
3  f    g    h    i
4  j    k <NA> <NA>

然而,原始数据帧非常大,因此循环似乎不是一种合适的方法。

你能告诉我如何优化吗?

非常感谢你的帮助,很遗憾没有更准确地询问。

拉​​米

1 个答案:

答案 0 :(得分:4)

删除行上任何位置的重复

df[t(apply(df,1,duplicated))]<-NA

要仅删除相邻的重复项,这应该有效:

df[]<-t(apply(df,1,function(rg){
            if(any(duplicated(rg))) {
                inddupl<-c(F,rg[2:length(rg)]==rg[1:(length(rg)-1)])
                rg[inddupl]<-NA
            }
            return(rg)
                   }))