提取表中的值

时间:2011-08-27 04:09:25

标签: r

我知道这似乎过分依赖于SO,但我是一名初学者并且在此工作了几天但没有成功。我可以为单个表执行此操作,但是当列表中的代码不起作用时。我希望每个人都了解情况。

我们在列表中有一个元素列表:

ls<-list("N","E","E","N","P","E","M","Q","E","M") 

我们在列表中有另一个表列表:

n <- list("M", "N","E","P","Q","M","N","E","Q","N") 
tb <- lapply(1:10, function(i)matrix(sample(4), 2, 2, 
           dimnames=list(n[sample(10,2)], n[sample(2,2)])))

我们需要从列表中的表中提取值,其中colname始终为“M”,其中rowname应该是列表tb中表1中的第一个元素,表2中的表2中的第二个元素,依此类推...

例如:

 M N 

N 4 1

P 3 2 

在表1中,我们需要提取值4.

1 个答案:

答案 0 :(得分:1)

我放弃了。以下是我认为可能接近期望结果的内容,但是1)为再现性设置种子,2)将名称更改为“ls1”和“n1”,使它们不与ls函数重叠,更“具体”:

set.seed(123)
tb <- lapply(1:10, function(i) matrix(sample(4), 2, 2, 
            dimnames=list( n1[sample(10,2)], n1[sample(2,2)])))
val <- rep(NA,10)
for (i in seq_along(tbls) ){    
  # will a need A test for both alpha values having  match with the two dimnames 
               rowidx <- which(dimnames(tb[[i]])[[1]] == ls1[[i]]) # often length==0
               colidx <- which(dimnames(tb[[i]])[[2]] == n1[[i]])
    if( length(rowidx) & length(colidx) ){ 
           val[i] <- tb[[i]][rowidx,colidx] 
                 } else { val[i] <- "not" }

> val
 [1] "1"   "not" "not" "not" "not" "not" "not" "not" "not" "2"  

我合理化提供了一个工作实例,假设情况是由一些外部资源产生的设计糟糕的数据结构,只需要“应对”。它确实说明了使用seq_along作为索引,使用[[访问列表结构,以及处理缺少哪些/匹配可能性的方法。我仍然认为这不应该被用作解决问题的模板。