R根据索引将列表填入列中

时间:2014-09-01 18:15:53

标签: r data-structures

我有许多不同长度的数据集,我试图将其作为有序数据结构。

目前,我正在尝试将列表插入到基于索引号填充的常规数据结构中。

使用以下代码:

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  

有任何建议或提示吗?

谢谢,

马特

2 个答案:

答案 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