根据列表值大小在R for循环中获取特定操作

时间:2014-06-03 11:09:34

标签: r

我有以下代码:

T1 <- list(t1, id_list=list(), Values=c())
T2 <- list(t2, id_list=list(), Values=c())

values1 = as.numeric(as.vector(values1))
T1$Values = values1
n.id.list1 = length(sort(unique(values1)))
order.list1 = sort(unique(values1))
for ( i in 1:n.id.list1) {
  id1 =  order.list1[i]
  T1$id_list[[i]] <- which(values1==id1) 
}
对于T2来说同样如此:

values2 = as.numeric(as.vector(values2))
T2$Values = values2
n.id.list2 = length(sort(unique(values2)))
order.list2 = sort(unique(values2))
for ( i in 1:n.id.list2) {
  id2 =  order.list2[i]
  T2$id_list[[i]] <- which(values2==id2)
}

a <- length(T1$id_list)
b <- length(T2$id_list)
size_lists<-matrix(0,2,max(a,b))

列表大小:

for (i in 1:a){
  size_lists[1,i] <- length(T1$id_list[[i]])
}
for (j in 1:b){
  size_lists[2,j] <- length(T2$id_list[[j]])
}

列表之间的匹配数量:

for (i in 1:a) {
  for (j in 1:b){

    size_matching[i,j] <- length(intersect(T1$id_list[[i]], T2$id_list[[j]])
  }
}

最后我计算了列表之间的条件概率:

for (i in 1:a) {
  for (j in 1:b) {
    if(size_lists[1,i] > 0 & (size_lists[2,j]/size_lists[1,i] > 0.5)) {

      match[i,j] <- round((size_matching[i,j]/size_lists[1,i]),digits=2)
    } else {
      match[i,j] <- 0
    }
  }
}

我想仅为特定的List Sizes计算这些 match [i,j] ,如上所述,以简化该过程。我的想法是通过缩小尺寸来排序列表,并按大小计算某些 top K 列表的match,但我无法做到。

我尝试使用values1values2table进行排序,但它并没有真正符合我的想法。我还尝试在列表大小(上面的& (size_lists[2,j]/size_lists[1,i] > 0.5))之间包含一个比率,但阈值取决于列表。

编辑:

关于MrFlick的评论:

我在两个不同的时间点t1和t2有两个列表L1和L2。在每个时间点,输入给出了这些列表的成员资格(“值”列表),即,对于某些类,它给出了它所在的所属组。

e.g:

color   values1(t1) values2(t2)

white   1   2
blue    2   2
red         1       1
orange  2   NA
violet  2   4
brown   NA  2
black   1   3
purple  3   3
green   3   2
grey    2   2
yellow  1   NA
gold    NA  1
pink    1   1
silver  3   3
darkred 1   3

所需输出是描述t1和t2之间转换的列表。问题是我想根据列表大小限制条件概率的计算(它为每对类计算它们)。例如,在t1中具有较高成员资格的类仅在t2中为大小最高的前5个类运行匹配[i,j]。就像我说的那样,我尝试在列表大小之间使用一些比例,但它确实不起作用。

0 个答案:

没有答案