2012-07-16 86 views
3

我想比较两个列表(两行数据帧)并计算两个列表之间有多少差异。R:列表2中列表1的元素数量/出现次数

例如:

列表1
list1=a,b,c,a 
list2=a,a,d,d 

两个元素都在列表2

我能够做到这一点与一个循环,并总和,但它是非常低效的。在R中有这样的功能吗?

我检查了setdiff和比较软件包,但没有找到任何有用的东西。

感谢您的想法,

文森特

我的功能看起来像:

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

回答

7

一个主要点:你的列表ISN” t 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,您可以使用和sapply组合unique

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

    i==l2检查会员数出现的次数,时间真出现和sapplysum计数数基本上是一个for循环在unique(l1)

    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 
    
+0

对不起,关于名称。它是一个来自数据框的向量,因此变量类型可能不同...我将编辑问题 – VincentH 2012-07-16 09:23:43

+0

记住向量可以有不同的类型:它们可以是字符,数字或逻辑 – csgillespie 2012-07-16 09:24:57

+0

非常感谢!那是我正在寻找的。没有时间来编辑我的问题:) – VincentH 2012-07-16 09:25:08

1

您是否尝试过这样的事情?

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

更新

既然你正在寻找的频率,我也觉得是很自然的考虑table

总体来说,我觉得问题有点混乱。您的问题指出,您正在查找出现在另一个列表(list2)中的出现次数(list1),但在接受的答案中(和我的coSums(table...示例中,您还计算d,其中未出现。list1因此,我提供使用table%in%,你的问题相匹配的最后一个例子,但可能不是你在找什么这是:

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

# a 
# 2 
+0

的事情是,我想知道每个元素有多少次出现不仅它是否存在。 – VincentH 2012-07-16 09:17:25

+0

类似: list1的= C( “A”, “B”, “C”, “A”) 列表2 = C( “一”, “一个”, “一”, “一个”) 列表2 %in%list1 我想得到2 – VincentH 2012-07-16 09:19:18

+0

@VincentH,'TRUE'为'1'和'FALSE'为'0',所以'sum(list2%in%list1)'会给你'2' 。 – A5C1D2H2I1M1N2O1R2T1 2012-07-16 09:25:18

相关问题