好吧,我是一个相当不错的 R 程序员,每周工作 3/5 天,上周我遇到了一个相当独特的问题。我在 R-studio 工作,无法合并前面描述的数据集
我有 2 个数据集:
数据集df:20 个变量的 13287320 个观测值
数据集data1:2 个变量的 9453 个观测值
df和data1都有一个共同的变量,即user
df有多个用户副本,所以它看起来有点像:
user var2 var3 var4 ........ var20
1a x x x x
1a x x x x
1a x x x x
2a x x x x
2a x x x x
3a x x x x
4a x x x x
5a x x x x
6a x x x x
6a x x x x
6a x x x x
. . . . .
. . . . .
. . . . .
etc.
Run Code Online (Sandbox Code Playgroud)
data1看起来更整洁:
user date
1b .
2b .
3b .
4b .
5b .
6b .
. .
. .
. .
etc.
Run Code Online (Sandbox Code Playgroud)
显然,我很清楚,合并通常是通过merge()
安装 plyr 包来完成的join()
。
现在来说说实际问题:
当我尝试使用时:
x <- merge(df, data1, by="user", all=FALSE)
Run Code Online (Sandbox Code Playgroud)
结果将是x
21 个变量有 0 个观测值
所以我想,让我们尝试一下这个join()
功能并使用以下代码:
library(plyr)
x <- join(df, data1, by="user", type="inner")
Run Code Online (Sandbox Code Playgroud)
这导致x
21 个变量的观测值为 0
我尝试了无数不同类型/全部的变体,并省略了部分,但所有结果都是相同的。
我当时的想法是实际测试 df 的用户是否在 data1 中,因此我尝试了第一个用户(用户 1)的子集
x <- subset(df, user == "1b")
Run Code Online (Sandbox Code Playgroud)
结果是一个包含x
3 个观测值和 20 个变量的子集。(示例中的 1a)。
我有点不知道下一步该去哪里。
我的一个想法是对唯一用户进行子集化,但是我不确定如何实现这一点
a <- unique(data1$user)
b <- subset(df, user %in% c(a))
Run Code Online (Sandbox Code Playgroud)
上面的代码似乎也不起作用,所以如果有人可以帮助我,我将不胜感激。
编辑变量名称以避免进一步混淆
all=FALSE
您在合并调用中指定。这意味着,如果 df 中有一个元素不在 data1 中,则不会包含该元素,如果 data1 中有一个元素不在 df 中,则也不会包含该元素。查看您的示例数据,用户列没有任何匹配的内容。这就是为什么它是空的。
如果你认为应该有匹配,你需要做一些工作,因为 R 不知道你打算如何匹配它们。
请注意,默认情况下,它将使用共享公共名称的所有列来进行匹配,并且为了“匹配”某些内容,匹配列中的所有元素都必须相同。因此,如果 df 和 data1 之间共享多个列名,则可能会遇到此问题。如果您只想匹配单个列,您可以使用by
(或by.x
和by.y
) 参数指定要匹配的列。
归档时间: |
|
查看次数: |
31169 次 |
最近记录: |