我想用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
应该相对简单,但我根本就没有到达那里......
答案 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))
})
因此如果y
与lag(y)
返回NA
相同,则返回y
。但不是y
的第一个元素,因为lag(y[1])
是NA
。