R:列表1中有多少元素在列表2中/发生次数

R:列表1中有多少元素在列表2中/发生次数,r,list,compare,R,List,Compare,我想比较两个列表(数据帧的两行)并计算两个列表之间的差异 例如: list1=a,b,c,a list2=a,a,d,d 列表1的两个元素在列表2中 我可以通过循环和求和来实现这一点,但效率非常低。在R中是否有这样做的功能 我已经检查了setdiff和compare包,但没有找到任何有用的东西 谢谢你的想法 文森特 我的函数如下所示: NRebalancing=function(NamePresent) { Nbexchange=NamePr

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

例如:

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)
        }

你试过这样的东西吗

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

既然你在寻找频率,我也认为考虑<代码>表< /> >是很自然的。

总的来说,我觉得这个问题有些令人困惑。您的问题表明,您正在查找一个列表(
list2
)中出现在另一个列表(
list1
)中,但在已接受的答案(以及我的
coSums)中出现的次数(表…
示例,您也在计算
d
,它没有出现在
列表1
中。因此,我使用
表和%
中的
%提供了最后一个示例,它与您的问题相匹配,但可能不是您要查找的。这里是:

table(list2[which(list2 %in% list1)])

# a 
# 2

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

R> is.vector(l1)
[1] TRUE
R> is.list(l1)
[1] FALSE
如果变量是向量,不要调用变量
list1


因为你有一个向量,所以有很多可能性

  • %
  • 运算符中的
    %

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

    R> l1[is.element(l1, l2)]
     [1] "a" "d"
    
  • 还有
    唯一的

    R> unique(l2)
     [1] "a" "d"
    
    在您对@mrdwab的评论之后,您可以使用
    sapply
    unique

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

  • @mrdwab的一个非常好的建议是使用
    colSums

    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 
    

  • 问题是,我想知道每个元素存在多少次,而不仅仅是它是否存在。对于类似于:list1=c(“a”、“b”、“c”、“a”)的东西,list2=c(“a”、“a”、“a”、“a”)list2%在%list1中,我想得到2@VincentH,
    TRUE
    计为
    1
    FALSE
    计为
    0
    ,因此
    sum(列表1中的列表2%)
    会给你
    2
    @VincentH,在你评论中的示例数据中,为什么你不希望得到
    2
    作为答案?
    a
    list1
    中,而
    a
    list2
    中出现4次,那么你为什么不期望
    4
    作为答案呢?很抱歉,我不清楚。事实上,我想数一数list2中的元素在List1中出现了多少次?对名称表示担忧。它是来自数据帧的向量,因此变量类型可能不同…我将编辑问题请记住向量可以有不同的类型:它们可以是字符、数字或逻辑。非常感谢!这就是我要找的。没有时间编辑我的问题:)@csgillespie,+1表示详细信息和不同的选项。我认为
    table
    plus
    colSums
    也能很好地实现这一点。@mrdwab使用table非常简洁-这不是我经常使用的函数。
    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