2016-04-28 21 views
0

このデータフレームで一意の約23,000行の列 "id"を持つデータセット "a"があります。私は別の2つのデータセット "b"と "c"でこれらのユニークな値の出現頻度を数えたいと思います。 「ID」は、データフレーム「B」の第45列あるので、Countif関数(Excel)in R

count1 <- as.data.frame(apply(a,1,function(x)sum(b$id==x[45]))) 
a <- cbind(a,count1) 

: これを行うために、私は、コードを試してみました。 コードはBでカウントのために働くが、私はデータフレーム「C」の「ID」の頻度をカウントするための同じコードを試みた場合:データフレーム「C」に

count2 <- as.data.frame(apply(a,1,function(x)sum(c$id==x[17]))) 

「ID」を17列にあります。すべての "id"の頻度は0としてカウントされますが、そうではありません。誰でも問題がどこにあるのか、この問題を解決する方法を提案できますか?

+1

これは、失敗したコードを表示することが悪い考えである理由の優れた例です。むしろ目標と入力と出力を記述する最小限の例を掲示することが好ましい。通常、COUNTIF問題はsum(論理式)で解決されると予想されます。 –

答えて

2

私たちは実際には少し奇妙に見えるかもしれないが、比較的単純な方法でこれを行うことができます。最初にデータフレームabを使って作業してみましょう。少し簡単にしましょう。さんはabの両方でid変数は、次のされていると仮定しましょう:この単純な例では

a_id <- 1:5 
b_id <- 1:5 

a_idb_idは全く同じです。私たちが知りたいのは、a_idの値がそれぞれb_idに何回現れるかです。私たちは明らかにその答えがそれぞれ1回であることを知っていますが、どのようにRにそれを教えてもらうのですか? table機能が便利に来ることができるところです。少し醜い見えるかもしれませんが、あなたは我々が上に私たちのb_id秒を持っていることがわかります(1-5)と左に私たちのa_id

table(a_id, b_id) 
#  b_id 
# a_id 1 2 3 4 5 
# 1 1 0 0 0 0 
# 2 0 1 0 0 0 
# 3 0 0 1 0 0 
# 4 0 0 0 1 0 
# 5 0 0 0 0 1 

手の側。対角線の下には、a_idの各値がb_idに何回表示されているかがわかります。既に知っているようにそれぞれ1です。それでは、どうやってその情報を得るのですか?

diag(table(a_id, b_id)) 
# 1 2 3 4 5 
# 1 1 1 1 1 

そしてそこに我々はそれを持っている:Rは、私たちのために主対角を取得diagと呼ばれる素敵な機能があります。私たちの "countif"値を持つベクトル。しかし、b_idの値がすべてa_idにない場合はどうなりますか?私たちがやったことをしようとすると、2つのベクトルの長さが異なる場合、tableはそれを好まないので、エラーが発生します。ですので、少し修正しています:

ここに新しいものがいくつかあります。 %in%を使用すると、ベクトルに値が存在するかどうかをRに伝えるように要求するだけです。たとえば、1 %in% 1:3TRUEを返しますが、4 %in% 1:3FALSEを返します。次に、[を使用してb_idのインデックスを作成したことがわかります。これは、b_id %in% a_idTRUEであるb_idの値の返りのみです。この場合はすべてb_idです。

それでは、これは我々がb_idの各a_idの複数の値を期待していますが、すべてのa_id値はb_idにあるとされていない場合のように見えるのでしょうか?のは、より実際の例を見てみましょう:

a_id <- 1:10 
b_id <- sample(3:7, 1000, replace=TRUE) 
table(b_id[b_id %in% a_id]) 
# 3 4 5 6 7 
# 210 182 216 177 215 

私が言ったように、それは最初は少し奇妙に思えるかもしれませんが、それは前方に比較的まっすぐです。うまくいけば、これはあなたを混乱させるよりもあなたを助けます。