用列表中的NA替换连续的重复值

时间:2017-10-30 11:04:57

标签: r list function lapply

我想用NA替换存储在列表中的数据帧中的连续重复值,请参阅下面的示例:

A = data.frame(matrix( 
c(1, 2, 3, 1, 1, 3, 3, 1), 
  nrow=4, 
  ncol=2))

B = data.frame(matrix( 
  c(1, 1, 2, 1, 1, 2, 3, 1), 
  nrow=4, 
  ncol=2))

myList <- list(A,B)

,并提供:

[[1]]
  X1 X2
1  1  1
2  2  3
3  3  3
4  1  1

[[2]]
  X1 X2
1  1  1
2  1  2
3  2  3
4  1  1

我的目标是

[[1]]
  X1 X2
1  1  1
2  2  3
3  3  NA
4  1  1

[[2]]
  X1 X2
1  1  1
2  NA 2
3  2  3
4  1  1

我认为lapply应该相对简单,但我根本就没有到达那里......

2 个答案:

答案 0 :(得分:3)

使用diff:

res <- lapply(myList, function(i)
  data.frame(lapply(i, function(j)
    ifelse(c(FALSE, diff(j) == 0), NA, j)
  )))

res
# [[1]]
#   X1 X2
# 1  1  1
# 2  2  3
# 3  3 NA
# 4  1  1
# 
# [[2]]
#   X1 X2
# 1  1  1
# 2 NA  2
# 3  2  3
# 4  1  1

答案 1 :(得分:3)

这是一种使用library(dplyr)

的滞后函数的方法
library(dplyr)

  lapply(myList, function(x){
      b = apply(x, 2, function(y){
        c(y[1],ifelse(y == lag(y), NA, y)[2:length(y)])
         })
      return(as.data.frame(b))
    })

因此如果ylag(y)返回NA相同,则返回y。但不是y的第一个元素,因为lag(y[1])NA