1

次のようなデータフレームがあります。

   id fromuserid touserid from_country to_country length
1   1   54525953 47195889           US         US      2
2   2   54525953 54361607           US         US      1
3   3   54525953 53571081           US         US      2
4   4   41943048 55379244           US         US      1
5   5   47185938 53140304           US         PR      1
6   6   47185938 54121387           US         US      1
7   7   54525974 50928645           GB         GB      1
8   8   54525974 53495302           GB         GB      1
9   9   51380247 45214216           SG         SG      2
10 10   51380247 43972484           SG         US      2

各行は、あるユーザーから別のユーザーに送信されたメッセージの数(長さ)を示しています。

私がやりたいのは、各国間で送信されるメッセージの視覚化を(D3のコード図を介して)作成することです。

ほぼ200カ国があります。次のように関数dcastを使用します。

countries <- dcast(chats,from_country ~ to_country,drop=FALSE,fill=0)

これは、以前はデータセットと変数が少なかったときに機能しましたが、このデータセットは300万行を超えており、いわばデバッグが容易ではありません。

とにかく、私が今得ているのは正方形ではない行列であり、なぜそうなのか理解できません。私が取得することを期待しているのは、本質的に、(i,j)thセルがに送信されたメッセージを表すcountry i行列country jです。最終的にはこれに非常に近いものになりますが、一部の行と列が明らかに欠落しています。これは、US-> USメッセージが1行または列シフトして表示されるため、簡単に見つけることができます。

これが私の質問です。明らかに間違っていることはありますか?そうでない場合、これを整理するためにデータセットで探す必要のある「奇妙な」ものはありますか?

4

1 に答える 1

3

「from_country」変数と「to_country」変数が因子であり、それらが同じレベルを共有していることを確認してください。共有したサンプルデータの使用:

chats$from_country <- factor(chats$from_country, 
                             levels = unique(c(chats$from_country, 
                                               chats$to_country)))
chats$to_country <- factor(chats$to_country, 
                           levels = levels(chats$from_country))
dcast(chats,from_country ~ to_country, drop = FALSE, fill = 0)
# Using length as value column: use value.var to override.
# Aggregation function missing: defaulting to length
#   from_country US GB SG PR
# 1           US  5  0  0  1
# 2           GB  0  2  0  0
# 3           SG  1  0  1  0
# 4           PR  0  0  0  0

「from_country」変数と「to_country」変数がすでに因子であるが、同じレベルではない場合、最初のステップで次のようなことを行うことができます。

chats$from_country <- factor(chats$from_country, 
                             levels = unique(c(levels(chats$from_country), 
                                               levels(chats$to_country)))

なぜこれが必要なのですか?それらすでに因子である場合c(chats$from_country, chats$to_country)、因子を数値に強制します。これは因子のどの文字値とも一致しないため、結果はになり<NA>ます。

于 2013-03-13T17:52:27.920 に答える