【问题标题】:R: How many element of list 1 are in list 2/Number of occurencesR:列表 1 中有多少元素在列表 2 中/出现次数
【发布时间】:2012-07-16 09:06:14
【问题描述】:

我想比较两个列表(数据框的两行)并计算两个列表之间的差异。

例如:

list1=a,b,c,a
list2=a,a,d,d

列表 1 的两个元素在列表 2 中

我可以通过循环和求和来做到这一点,但效率很低。 R中是否有任何功能可以做到这一点?

我检查了 setdiff 和 compare 包,但没有找到任何帮助。

感谢您的想法,

文森特

我的功能如下:

        NRebalancing=function(NamePresent)
        {
          Nbexchange=NamePresent[,2]
          Nbexchange=NamePresent[1,2]=0

          for (i in 2:nrow(NamePresent))
          {
            print(i)
            compteur=0
            NameNeeded=NamePresent[i,]
            NameNeeded=unique(NameNeeded)
            NameNeeded=na.omit(NameNeeded)
            for(j in 2:length(NameNeeded))
              #j=1 correspond a une date
            {
              compteur = compteur+(abs(sum(NamePresent[i,]==as.character(NameNeeded[j]))-sum(NamePresent[i-1,]==as.character(NameNeeded[j]))))
            }
          Nbexchange[i]=compteur  
          }

          return(Nbexchange)
        }

【问题讨论】:

    标签: r list compare


    【解决方案1】:

    一个要点:您的列表不是 R 列表 - 这有点特别。您正在使用向量:

    R> is.vector(l1)
    [1] TRUE
    R> is.list(l1)
    [1] FALSE
    

    如果变量是向量,不要调用list1


    既然你有一个向量,就有很多可能性。

    1. %in% 运算符

      R> l1 = c("a", "b", "c", "d")
      R> l2 = c("a", "a", "d", "d")
      R> l1[l1 %in% l2]
       [1] "a" "d"
      
    2. 或使用is.element

      R> l1[is.element(l1, l2)]
       [1] "a" "d"
      
    3. 还有unique

      R> unique(l2)
       [1] "a" "d"
      

      根据您对@mrdwab 的评论,您可以使用sapplyunique 的组合来计算出现次数

      sapply(unique(l1), function(i) sum(i==l2))
      

      i==l2 检查成员资格,sum 计算 TRUE 出现的次数,sapply 基本上只是 unique(l1) 上的 for 循环

      R> sapply(unique(l1), function(i) sum(i==l2))
      a b c d 
      2 0 0 2
      
    4. @mrdwab 的一个非常好的建议是使用tablecolSums

      R> table(l1, l2)
        l2 l1  
         a d
       a 1 0
       b 1 0
       c 0 1
       d 0 1
      R> colSums(table(l1, l2))
       a d 
       2 2 
      

    【讨论】:

    • 对不起这个名字。它是来自数据框的向量,因此变量类型可能不同...我将编辑问题
    • 记住向量可以有不同的类型:它们可以是字符、数字或逻辑
    • 非常感谢!那就是我要找的。没有时间编辑我的问题:)
    • @csgillespie,+1 了解详细信息和不同选项。我认为table 加上colSums 也适用于此。
    • @mrdwab 使用表格非常简洁——这不是我经常使用的功能。
    【解决方案2】:

    你尝试过这样的事情吗?

    list1 = c("a", "b", "c", "a")
    list2 = c("a", "a", "d", "d")
    list2 %in% list1
    # [1]  TRUE  TRUE FALSE FALSE
    

    更新

    既然你在寻找频率,我也认为考虑table是很自然的。

    总的来说,我觉得问题有点令人困惑。您的问题表明您正在寻找另一个列表 (list1) 中存在的一个列表 (list2) 中出现的次数,但在接受的答案中(在我的 coSums(table... 示例中,您也在计算 @ 987654326@,在list1没有出现。因此,我提供了最后一个使用table%in% 的示例,它与您的问题相匹配,但可能不是您想要的。这里是:

    table(list2[which(list2 %in% list1)])
    
    # a 
    # 2
    

    【讨论】:

    • 问题是我想知道每个元素出现了多少次,而不仅仅是它是否存在。
    • 例如:list1 = c("a", "b", "c", "a") list2 = c("a", "a", "a", "a ") list2 %in% list1 我要2个
    • @VincentH, TRUE 算作1FALSE 算作0,所以sum(list2 %in% list1) 会给你2
    • @VincentH,在您评论中的示例数据中,您为什么希望得到2 作为答案? alist1 中,alist2 中出现 4 次,那么您为什么不期待 4 作为答案呢?
    • 很抱歉不清楚。事实上,我想计算 list2 中的元素出现在 list1 中的次数
    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多