将分类列表转换为具有等级的矩阵

时间:2014-09-09 13:56:15

标签: r

抱歉,再次提出一些基本问题。

我有六个分类数据列表:

[1] A,B,C,D
[2] C,D,B,A

最后,我希望有一个矩阵,看起来像

  [1],[2]

[A] 1,4

[B] 2,3

[C] 3,1 

[D] 4,2

这样每列都包含分类数据的排名列表。非常感谢你!

2 个答案:

答案 0 :(得分:2)

您的输入数据集

尚不清楚
  l1 <- list(LETTERS[1:4], LETTERS[c(3:4, 2:1)])
  library(reshape2) 
  dat1 <- transform(melt(l1), indx=ave(seq_along(value), L1, FUN=seq_along))[,-2]
  split(dat1$indx, dat1$value)
  # $A
  #[1] 1 4

  # $B
  #[1] 2 3

  # $C
  #[1] 3 1

  # $D
  #[1] 4 2

如果您需要矩阵输出

  do.call(rbind,split(dat1$indx, dat1$value))

更新

或者您可以使用mapply

  res2 <- mapply(match, rep(list(LETTERS[1:4]),length(l1)), l1)
  rownames(res2) <- LETTERS[1:4]
   res2
  #   [,1] [,2]
  #A    1    4
  #B    2    3
  #C    3    1
  #D    4    2

或使用@alexis_laz提供的sapply

  res3 <- sapply(l1, function(x) match(LETTERS[1:4], x))
  rownames(res3) <- rownames(res2)

或者,在这种情况下:

   sapply(l1, order)
   #      [,1] [,2]
   #[1,]    1    4
   #[2,]    2    3
   #[3,]    3    1
   #[4,]    4    2

答案 1 :(得分:0)

这应该适合你:

a <- c(toupper(letters[1:4]))
b <- c("C","D","B","A")
n <- length(a)

dfs <- list(a, b)
ranks <- rep(list(seq(n)), length(dfs))

for(i in 1:length(ranks)){
  names(ranks[[i]]) <- dfs[[i]]
  ranks[[i]] <- ranks[[i]][order(names(ranks[[i]]))]
}

sapply(ranks, FUN = function(x) x)