使用一个列表替换另一个列表中的值

时间:2016-07-01 21:40:31

标签: r dataframe lapply na mapply

如何使用一个向量列表替换另一个数据帧列表中的值?最终,我想要一个数据框,其中某些值被NA取代。

list1 <- list(1:2, 3:4, 5:6)
list2 <- as.list(data.frame(mat.or.vec(6, 3)))

desired_ouput <- data.frame(mat.or.vec(6, 3))
desired_ouput[1:2, 1] <- NA
desired_ouput[3:4, 2] <- NA
desired_ouput[5:6, 3] <- NA
desired_ouput

enter image description here

3 个答案:

答案 0 :(得分:4)

这可能看起来不太明显,但相当有效(完全矢量化,没有for循环或*apply 系列)

y <- unlist(list2, use.names = FALSE); m <- length(list2[[1]])
x <- unlist(list1) + rep((0:(length(list1)-1)) * m, lengths(list1))
y[x] <- NA; attr(y, "dim") <- c(m, length(y) / m)
as.data.frame(y)

#   V1 V2 V3
# 1 NA  0  0
# 2 NA  0  0
# 3  0 NA  0
# 4  0 NA  0
# 5  0  0 NA
# 6  0  0 NA

为什么这样?根据OP的陈述,我可以知道list1可能是不稳定的,而list2则不能(因为后来的OP希望将更新的list2转换为数据框)。因此,有一种方法可以使用快速索引来解决这个问题。

感谢@ alexis_laz的评论,我可以使用

y <- unlist(list2, use.names = FALSE)

而不是

y <- unname(unlist(list2))

答案 1 :(得分:3)

只需用于:

list1 <- list(1:2, 3:4, 5:6)
df <- data.frame(mat.or.vec(6, 3))

for(i in 1:length(list1)) {
  df[list1[[i]], i] <- NA
}
# df
#    X1 X2 X3
# 1  NA  0  0
# 2  NA  0  0
# 3  0   NA 0
# 4  0   NA 0
# 5  0   0  NA
# 6  0   0  NA

答案 2 :(得分:2)

这是一种使用Map的方法:

myDf <- data.frame(Map(function(x, y) {y[x] <- NA; y}, list1, list2))
names(myDf) <- paste0("X", 1:ncol(myDf))

返回

myDf
  X1 X2 X3
1 NA  0  0
2 NA  0  0
3  0 NA  0
4  0 NA  0
5  0  0 NA
6  0  0 NA

Map生成一个列表对象,该对象包含在data.frame中以返回正确的对象。但是,有必要使用names为每列提供更好的名称。