我有许多不同长度的数据集,我试图将其作为有序数据结构。
目前,我正在尝试将列表插入到基于索引号填充的常规数据结构中。
使用以下代码:
mat <- matrix(NA,nrow=5,ncol=6)
mat[,1] <- LETTERS[1:5]
vec1 <- c("B","D","E")
vec2 <- c("A","C","E")
m1 <- match(mat[,1],vec1)
m2 <- match(mat[,1],vec2)
x1 <- which(!is.na(m1))
x2 <- which(!is.na(m2))
我想知道如何处理:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "A" NA "A" NA NA NA
[2,] "B" "B" NA NA NA NA
[3,] "C" NA "C" NA NA NA
[4,] "D" "D" NA NA NA NA
[5,] "E" "E" "E" NA NA NA
有任何建议或提示吗?
谢谢,
马特
答案 0 :(得分:3)
尝试
mat[match(vec1, mat[,1]), 2] <- vec1
mat[match(vec2, mat[,1]), 3] <- vec2
mat
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] "A" NA "A" NA NA NA
# [2,] "B" "B" NA NA NA NA
# [3,] "C" NA "C" NA NA NA
# [4,] "D" "D" NA NA NA NA
# [5,] "E" "E" "E" NA NA NA
或者
mat[mat[, 1] %in% vec1, 2] <- vec1
mat[mat[, 1] %in% vec2, 3] <- vec2
或更通用的方法
mylist <- list(vec1, vec2)
indx <- unlist(lapply(seq_len(length(mylist) + 1)[-1],
function(x) match(matchlist[[x-1]], mat[, 1])))
indx2 <- rep(seq_len(length(mylist) + 1)[-1], sapply(mylist , length))
mat[cbind(indx, indx2)] <- unlist(mylist)
答案 1 :(得分:0)
如果您有更多列匹配,也可以这样做:
mat1 <- mat
indx <- which(outer(mat[,1], c(vec1, vec2), "=="), arr.ind=TRUE)[,1]
indx1 <- rep(1:2, c(length(vec1), length(vec2))) +1
mat[cbind(indx, indx1)] <- c(vec1,vec2)
mat
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] "A" NA "A" NA NA NA
#[2,] "B" "B" NA NA NA NA
#[3,] "C" NA "C" NA NA NA
#[4,] "D" "D" NA NA NA NA
#[5,] "E" "E" "E" NA NA NA
假设您需要根据多个矢量匹配填充更多列
vec3 <- c("A", "D")
vec4 <- c("B", "C")
veclist <- mget(ls(pattern="vec\\d"))
unlist(veclist, use.names=FALSE)
#[1] "B" "D" "E" "A" "C" "E" "A" "D" "B" "C"
indx <- which(outer(mat[,1], unlist(veclist), "=="), arr.ind=TRUE)[,1]
indx1 <- rep(seq(length(veclist))+1, sapply(veclist, length))
mat1[cbind(indx, indx1)] <- unlist(veclist)
mat1
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] "A" NA "A" "A" NA NA
#[2,] "B" "B" NA NA "B" NA
#[3,] "C" NA "C" NA "C" NA
#[4,] "D" "D" NA "D" NA NA
#[5,] "E" "E" "E" NA NA NA