r - 更改数据帧结构(两个数据帧到一个)

标签 r join merge dplyr reshape

我有两个数据帧(data1data2)。

data1 <- data.frame(id = c(1,2,3),
                    var1 = c("x", "x", "x"),
                    var2 = c("y", "y", "y") )

data2 <- data.frame(id = c(1,2,3,4,5,6,7,8),
                    data1Id = c(1,1,2,2,2,3,3,3),
                    var3 = c(0, 3, 5, 2, 5, 2, 9, 8),
                    var4 = c(1, 6, 3, 6, 2, 8, 7, 5))

对于 data1 中的每个条目,data2 中都有多个条目。两个表都通过变量 data1Id 链接在一起。我的目标是拥有一个单一的 data.frame。所以我想将 data2 的列添加到 data1 并为 data2 中的每个条目将列名称递增 1。

在上面的例子中

id    var1    var2    var3_1   var3_2   var3_3    var4_1   var4_2   var4_3
----------------------------------------------------------------------------
1     x       y       0        3         NA       1        6        NA
2     x       y       5        2         5        3        6        2 
3     x       y       2        9         8        8        7        5

谁能告诉我如何实现这个目标?

最佳答案

你必须 reshape 你的data2,然后加入到data1:

library(tidyverse)

data2 %>%
  select(-id) %>%
  group_by(data1Id) %>%                            # for each data1Id
  mutate(indx = row_number()) %>%                  # create a row index (useful to reshape)
  ungroup() %>%
  gather(var, value, -data1Id, -indx) %>%          # reshape dataset
  unite(var, var, indx) %>%                        # combine those to columns to create new column names for reshaping
  spread(var, value) %>%                           # reshape again
  right_join(data1, by = c("data1Id" = "id")) %>%  # join to data1
  select(id = data1Id, var1, var2, everything())   # update column order

# # A tibble: 3 x 9
#      id var1  var2  var3_1 var3_2 var3_3 var4_1 var4_2 var4_3
#   <dbl> <fct> <fct>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
# 1     1 x     y          0      3     NA      1      6     NA
# 2     2 x     y          5      2      5      3      6      2
# 3     3 x     y          2      9      8      8      7      5

关于r - 更改数据帧结构(两个数据帧到一个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56902287/

相关文章:

r - 在 R 中重现并行SVM结果的问题

r - 使用 `withCallingHandlers`捕获任意条件

mysql - 使用多个查询而不是一个查询是否曾经是 "ok"?

c - C语言合并双链表

c# - windows phone 8中如何合并音频和视频

c - 归并排序和递归

r - 以列名作为标题绘制数据框的列

MySQL DISTINCT 函数没有按预期工作

mysql - LEFT JOIN 显示与 RIGHT JOIN 不同的结果 - 当自己连接表时......为什么?

r - 如何创建条形图并显示平均 Y 值