【问题标题】:Merging wide data into a long dataframe format R将宽数据合并为长数​​据帧格式R
【发布时间】:2021-12-01 10:45:05
【问题描述】:

我有两个数据框,一个长一个宽,我正在尝试将两者合并在一起。我有宽格式的人口统计信息,我需要将其转换为长格式进行分析。当我合并两个数据框时,宽格式的信息只填充一行,其余为空白。

这里有一些示例数据来展示我正在使用的内容以及我希望的结果。唯一的问题是合并在示例数据中有效,但在我的实际数据中无效。

df_long <- data.frame (id  = c(123, 123, 123, 345, 345),
                       x = c("abc", "cgf", "add", "wer", "nko"),
                       y = c(234, 234, 5436, 73435, 2353))
df_wide <- data.frame(id = c(123, 345),
                      person = c("Mom", "Teen"))

当我使用此代码合并示例数据时,它会产生我想要的数据

df_goal <- merge(df_long, df_wide)

当我使用这段代码时,它有正确数量的变量,但是 0 个观察值。

real_merged <- merge(real_long, real_wide)

为了解决这个问题,我添加了all = T 参数,但我得到的观察结果比我预期的要多。看起来合并只是将观察的数量从 df_wide 添加到 df_long,但与 ID 不匹配。我已经在视觉上确认有匹配的 ID,所以这不应该发生。

我的真实数据有超过 10 万行和 150 个变量。我不确定这是否与它有关,所以我只是把它扔在那里。

我尝试在合并函数中使用不同的参数,例如 all = T,但也没有使用它,以及 by = by.x = ,但没有一个结果是我想要的。我也研究过使用melt(),但我无法让它工作。

由于没有错误并且它不会在示例数据中重现,因此几乎不可能进行故障排除。我希望有人遇到过类似的问题并且知道解决方法。

【问题讨论】:

  • 欢迎来到 SO,Brian_p!我建议对您的问题进行编辑,以清理一些格式;也就是说,代码块(多于一行)应该在各自的行上都有“代码围栏”,从```r(没有代码)开始,然后是```,同样,每个都在文本行上完全隔离。格式化代码的两个很好的参考是meta.stackexchange.com/a/22189stackoverflow.com/editing-help。 (这主要是为了美观,但有时格式错误的代码有点难以阅读,所以我经常尝试帮助清理。)
  • @r2evans,感谢您提供有关格式化帖子的信息。我会查看您提供的链接并尝试更新我的示例中的代码。
  • id 的值可能略有不同,即使它们在显示时看起来相同,也会导致连接中的行不匹配。如果ids 应该是整数,请尝试在合并之前使用as.integer 更改它们。这将解决问题,例如123 实际上是 123.000000001 显示为 123
  • @IceCreamToucan,我仔细检查了两个变量的 typeof()class() 相同。
  • 它们是什么?如果它们是双打,它们可能看起来相同但具有不同的值。

标签: r dataframe dplyr merge


【解决方案1】:

您只需指定要保留其中一个表的所有数据,而不是两个表的所有数据(all=TRUE 保留两个表的所有数据,这是默认设置)。

df_long <- data.frame (id  = c(123, 123, 123, 345, 345),
                       x = c("abc", "cgf", "add", "wer", "nko"),
                       y = c(234, 234, 5436, 73435, 2353))

df_wide <- data.frame(id = c(123, 345),
                      person = c("Mom", "Teen"))

df_goal <- merge(df_long, df_wide, all.x=TRUE, by="id")

输出如下所示:

这里的all.x=TRUE 表示将向输出中添加额外的行,x 中的每一行在 y 中没有匹配的行。这些行将在那些通常用来自 y 的值填充的列中具有 NA。相反,如果它们确实匹配,则将使用 y 的值。

【讨论】:

  • 感谢您的建议。我尝试使用all.x = TRUE,但随后没有添加 df_wide 中的任何值,它们都是 NA。但我需要将 df_wide 中的数据填充到 df_long 的每一行中。
  • 你确定你的代码没有错字吗?如果我使用您的示例运行上述行,则结果符合预期。我已经用一个功能齐全的例子更新了代码。
  • 不,我没有任何拼写错误。正如我在帖子中提到的,它适用于示例数据,但不适用于我的实际数据。这真的很奇怪,我无法解释。我尝试以多种方式合并这两个数据帧并使用不同版本的 merge() 参数,但我无法让它工作。我重新启动了我的 R 会话,以为可能就是这样,但这并没有解决它。
【解决方案2】:

好的,我已经弄明白了。

我正在使用 foreign() 包将 SPSS 文件导入 R,其中一个数据框附有变量标签,这似乎是 ID 值未链接的原因。 Here is what the variable labels looked like after reading the data into R. 变量名有一种子标签。我不确定为什么会这样,但我将 SPSS 文件保存为 Excel 文件,然后将其读入 R。然后我重试了与新数据框的合并,它运行良好。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2022-07-28
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2021-05-01
  • 2022-01-04
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多