使用一个列表替换另一个列表中的值
use one list to replace values in another
如何使用一个向量列表替换另一个数据框列表中的值?最终,我想要一个数据框,其中某些值被 NAs 替换。
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
仅用于:
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
这是一个使用Map
的方法:
myDf <- data.frame(Map(function(x, y) {y[x] <- NA; y}, list1, list2))
names(myDf) <- paste0("X", 1:ncol(myDf))
其中return
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
到 return 适当的对象中。但是,有必要为每个列提供一个更好的名称 names
.
这可能看起来不明显,但相当有效(完全矢量化,没有 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))
如何使用一个向量列表替换另一个数据框列表中的值?最终,我想要一个数据框,其中某些值被 NAs 替换。
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
仅用于:
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
这是一个使用Map
的方法:
myDf <- data.frame(Map(function(x, y) {y[x] <- NA; y}, list1, list2))
names(myDf) <- paste0("X", 1:ncol(myDf))
其中return
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
到 return 适当的对象中。但是,有必要为每个列提供一个更好的名称 names
.
这可能看起来不明显,但相当有效(完全矢量化,没有 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))