我有一个数据框,如下所示:
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 i
to country j
。我最终得到的结果与此非常接近,但明显缺少一些行和列,这很容易发现,因为 US->US 消息显示移动了一行或一列。
这是我的问题。我所做的事情有明显错误吗?如果不是,我应该在数据集中寻找一些“奇怪的”东西来解决这个问题吗?
确保您的“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)))
为什么这是必要的?如果他们are已经因素,那么c(chats$from_country, chats$to_country)
会将因子强制为数字,并且由于它与因子的任何字符值都不匹配,因此会导致<NA>
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)