在列表中,将连续重复的值替换为NA。

3

我希望能够将列表中数据框中连续重复的值替换为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应该相对简单,但我就是做不到...


使用duplicated函数,遍历列表,然后遍历列。 - zx8754
3
lapply(list, function(x){ apply(x, 2, function(y){ return(ifelse(duplicated(y), NA, y)) }) })这段代码的作用是:对一个列表中的每个元素,应用一个函数来移除该元素中每一列的重复值,并将重复值替换为NA。 - missuse
我刚刚编辑了问题,使得在第4行中出现了来自同一列的进一步重复值。然而,只有连续的值应该被替换。如果我没有错的话,“duplicated”对此无效。非常感谢您的回复! - Luks
2个回答

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

3

以下是使用 library(dplyr) 中 lag 函数的方法:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接