2012-07-16 87 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

相關問題