【问题标题】:Replace consecutive repeated values with NA in list用列表中的 NA 替换连续的重复值
【发布时间】:2018-04-11 08:11:08
【问题描述】:

我想用 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,遍历列表,然后遍历列。
  • lapply(list, function(x){ apply(x, 2, function(y){ return(ifelse(duplicated(y), NA, y)) }) })
  • 我刚刚编辑了这个问题,以便在第 4 行中出现来自同一列的值的进一步重复。但是,只能替换连续的值。如果我没记错的话,“重复”对此不起作用。非常感谢您的回复!

标签: r list function lapply


【解决方案1】:

使用差异:

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

【讨论】:

    【解决方案2】:

    这是使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-07
      • 2019-06-27
      • 1970-01-01
      • 2021-06-28
      • 2022-12-17
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多