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)

当我有一个较小的数据集和较少的变量时,这对我有用,但是这个数据集超过 3M 行,并且不容易调试,可以这么说。

无论如何,我现在得到的是一个不是正方形的矩阵,我不知道为什么不。我期望得到的本质上是一个矩阵,其中(i,j)th单元格代表从country ito发送的消息country j。我最终得到的结果与此非常接近,但显然缺少一些行和列,这很容易发现,因为 US->US 消息显示移动了一行或一列。

所以这是我的问题。有什么我正在做的事情显然是错误的吗?如果没有,我应该在数据集中寻找一些“奇怪”的东西来解决这个问题吗?

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 回答