【问题标题】:Why won't my data frames merge?为什么我的数据框不会合并?
【发布时间】:2015-04-17 15:38:10
【问题描述】:

好的,所以我是一个相当不错的 R 程序员,每周工作 3/5 天,上周我遇到了一个相当独特的问题。我在 R-studio 工作,无法合并前面描述的数据集

我有 2 个数据集:
数据集 df:20 个变量的 13287320 个观察值
数据集 data1:2 个变量的 9453 次观察

dfdata1都有一个共同的变量,即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.

data1 看起来更整洁:

user  date
1b     .
2b     .
3b     .
4b     .
5b     .
6b     .
.      .
.      .
.      .
etc.

显然,我很清楚合并通常由merge() 或如果安装了软件包 plyr 完成join()

现在解决实际问题:

当我尝试使用时:

x <- merge(df, data1, by="user", all=FALSE)

结果将是 x 通过 21 个变量获得 0 个观察结果

然后我想,让我们试试join() 函数并使用以下代码:

library(plyr)
x <- join(df, data1, by="user", type="inner")

这导致 x 有 21 个变量的 0 个观察结果

我尝试了无数种不同类型/全部的变体,并省略了 by 部分,但结果都是一样的。

我当时的想法是实际测试 df 的用户是否在 data1 中,所以我尝试了第一个用户用户 1 的子集

x <- subset(df, user == "1b")

结果是x 有 3 个观察值和 20 个变量的子集。 (示例中为 1a)。

我有点不知道下一步该从哪里继续。

我的一个想法是对唯一用户进行子集化,但我不确定如何实现这一目标

a <- unique(data1$user)
b <- subset(df, user %in% c(a))

上面的代码似乎也不起作用,所以如果有人可以帮助我,将不胜感激。

编辑变量名以避免进一步混淆

【问题讨论】:

  • 请创建一个最小的可重现示例。您确定其中一个 data.frames 的 user 列中没有杂散空格吗?
  • 确保你在两个数据框中加入的列是相同的类型——要么是具有相同级别的因素,要么更简单地说,是一个字符。我建议只在两列上都做as.character()
  • 如果这不能解决问题,请发布 dput(head(df))dput(head(data1)) 以使其可重现到数据类型。
  • 另外,在您的示例中,两个数据集都有一个名为 var2 的列。这是准确的吗?如果是这样,你应该重命名其中一个,除非你也想合并它。

标签: r dataset


【解决方案1】:

刚遇到这个问题,发现是因为变量实际上不匹配。更改为字符而不是因子使这一点更加明显。通过第二个数据集中包含的空格合并的变量。 清理这个解决了我的问题。

祝你好运! 马特

【讨论】:

    【解决方案2】:

    您在合并调用中指定了all=FALSE。这意味着如果 df 中有一个元素不在 data1 中,则不会包含该元素,如果 data1 中有一个元素不在 df 中,则也不会包含该元素。查看您的示例数据,用户列没有任何匹配的内容。这就是为什么它是空的。

    如果您认为应该有匹配项,则需要做一些工作,因为 R 不知道如何您打算匹配它们。

    请注意,默认情况下,它将使用共享一个通用名称的所有列进行匹配,并且要“匹配”匹配列中的所有元素需要相同。因此,如果您在 df 和 data1 之间共享多个列名,您可能会遇到此问题。如果您只想匹配单个列,可以使用by(或by.xby.y)参数来指定要匹配的列。

    【讨论】:

    • 我很清楚 all=FALSE 的作用,因此我指定了它。我也知道有匹配的值,因为当我实际从数据中选择一个值并使用它来制作 df 的子集时,它实际上给了我返回值,因此出现了问题。另外恐怕对“var2”可能有一点误解,实际上是不同的,因此进行了编辑以避免进一步混淆
    • 如果您想避免混淆,请发布一个最小的可重现示例。现在我们正在偏离您认为描述您的数据的内容,但您可以看到这不是最佳的。给我们一些重现您的问题的数据。
    【解决方案3】:

    嘿,我知道我玩游戏迟到了,但我在 RStudio 工作,遇到了类似的问题。

    您是否在任一(或两个)数据框中都有大量列(加起来超过 100 个)?如果是这样,以下可能有用:

    似乎无论我做什么,在使用以下命令合并后,在 RStudio 的数据框查看器中查看两个数据框(df1 4023 x 150 vars,df2 4023 x 23 vars)时,它们都不会合并:

    dfall <- merge(df1, df2, by="lookup") 
    

    查找在df1df2 中都是唯一的。

    当我查看 RStudio 中的数据框查看器(环境窗口中的图表图标)时,似乎该命令失败了。实际上,此命令运行良好,但 RStudio 数据框查看器仅限于前 100 列,如果您有更多,它不会显示它们。在我看来,合并失败了。我花了几分钟才意识到合并工作正常,但查看器没有显示合并的列。

    三种方法可以查看您是否正在发生这种情况。

    1. 在 RStudio 的环境窗口中查看您的数据框是否大于 100 个变量(列在"value" 列中)。如果是你可能有同样的问题。

    2. 使用 R head() 命令在控制台中查看合并数据集的第一行(不会将列修剪到前 100 行)

    3. 将合并的数据框写入 CSV 并在 excel 或 google 表格中打开(使用以下命令导出):

      write.table(dfall, file="dfall.csv", sep=",", row.names=FALSE)
      

    这会将 csv 文件写入您的工作目录,该文件可以在 excel 或 google 表格中打开。检查文件以查看您的合并列是否存在。

    干杯。

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 2022-11-20
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      相关资源
      最近更新 更多