4

2 つのリスト (データ フレームの 2 行) を比較し、2 つのリスト間にいくつの違いがあるかを数えたいと思います。

例えば:

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

リスト 1 の 2 つの要素がリスト 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)
        }
4

2 に答える 2

9

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メンバーシップをチェックし、sumTRUE が表示された回数をカウントします。sapply基本的には for ループ オーバーです。unique(l1)

    R> sapply(unique(l1), function(i) sum(i==l2))
    a b c d 
    2 0 0 2
    
  4. @mrdwab からの非常に良い提案は、 and を使用することtableです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 
    
于 2012-07-16T09:14:46.153 に答える
1

このようなことを試しましたか?

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

アップデート

周波数を求めているのですから、 と考えるのも当然だと思いますtable

全体として、私は質問がやや混乱していると思います。list2あなたの質問は、別のリスト ( ) に存在する1 つのリスト ( ) に存在する出現回数を探していると述べていますがlist1、受け入れられた回答では (また、私の例では、 には表示されないcoSums(table...もカウントdしています。したがって、私はandを使用して最後の例を 1 つ提供していますが、これはあなたの質問に一致しますが、探しているものではない可能性があります。list1table%in%

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

# a 
# 2
于 2012-07-16T09:10:50.477 に答える