【问题标题】:Reformatting data sets in R data frame重新格式化 R 数据框中的数据集
【发布时间】:2021-01-30 23:34:54
【问题描述】:

我清理了我执行的模拟的文本输出。我在 R 中生成了一个数据框,其中包含 19 个类似的数据集,它们像这样垂直堆叠:

Data set 1
Data set 2
.
.
Data set 19

每个数据集有 260 行 4 列数据,格式如下:

A F 124 241
.
.
D Q 748 854

由于每个数据集在第 1 列和第 2 列中包含相同的值,因此包含 19 个数据集的整个数据框具有以下形式:

A F 124 241
.
.
D Q 748 856
A F 068 937
.
.
D Q 300 099
.
.
.
A F 175 235
.
.
D Q 725 893

我想弄清楚如何将数据集水平堆叠。由于所有 19 个数据集的第 1 列和第 2 列都是相同的,因此从第二个数据集开始,我只想提取第 3 列和第 4 列来创建具有这种布局的数据框:

A F 124 241 068 937 . . . 175 235
.
.
D Q 748 856 300 099 . . . 725 893

由于我从数据集 #1 中提取 4 列,而从数据集 #2 到 #19 中仅提取 2 列,因此新数据框将有 40 列和 260 行。

如果您有关于如何重新格式化此数据框的提示,请告诉我。谢谢!

干杯, Di

【问题讨论】:

  • 您应该提供实际数据的摘录,例如 dput()。您还应该提供之前尝试的所需输出和代码,以及这些尝试的结果

标签: r


【解决方案1】:

这是一个例子:

library(dplyr)
library(tidyr)
tmp <- data.frame(
  id1 = rep(LETTERS[1:13], 19), 
  id2 = rep(LETTERS[14:26], 19), 
  c1 = seq(1, 19*13, by=1), 
  c2 = seq(19*13, 1, by=-1) 
)

在您的数据集中,您必须添加一个数据集编号变量。由于每个数据集有 13 行,我这样做如下:

tmp <- tmp %>% 
  mutate(ds = rep(1:19, each=13)) 

然后,您可以使用 tidyr 包中的 pivot_wider() 以所需的方式重塑您的数据。

tmp <- tmp %>% 
  pivot_wider(names_from = ds, values_from = c("c1", "c2"))
tmp
# # A tibble: 13 x 40
#   id1   id2    c1_1  c1_2  c1_3  c1_4  c1_5  c1_6  c1_7  c1_8  c1_9 c1_10 c1_11 c1_12 c1_13 c1_14 c1_15 c1_16 c1_17 c1_18
#   <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A     N         1    14    27    40    53    66    79    92   105   118   131   144   157   170   183   196   209   222
# 2 B     O         2    15    28    41    54    67    80    93   106   119   132   145   158   171   184   197   210   223
# 3 C     P         3    16    29    42    55    68    81    94   107   120   133   146   159   172   185   198   211   224
# 4 D     Q         4    17    30    43    56    69    82    95   108   121   134   147   160   173   186   199   212   225
# 5 E     R         5    18    31    44    57    70    83    96   109   122   135   148   161   174   187   200   213   226
# 6 F     S         6    19    32    45    58    71    84    97   110   123   136   149   162   175   188   201   214   227
# 7 G     T         7    20    33    46    59    72    85    98   111   124   137   150   163   176   189   202   215   228
# 8 H     U         8    21    34    47    60    73    86    99   112   125   138   151   164   177   190   203   216   229
# 9 I     V         9    22    35    48    61    74    87   100   113   126   139   152   165   178   191   204   217   230
# 10 J     W        10    23    36    49    62    75    88   101   114   127   140   153   166   179   192   205   218   231
# 11 K     X        11    24    37    50    63    76    89   102   115   128   141   154   167   180   193   206   219   232
# 12 L     Y        12    25    38    51    64    77    90   103   116   129   142   155   168   181   194   207   220   233
# 13 M     Z        13    26    39    52    65    78    91   104   117   130   143   156   169   182   195   208   221   234

【讨论】:

  • 感谢这个有用的提示 - 看起来这确实对我有帮助!我是 R 新手(今天才开始使用),我不熟悉它的功能。我将首先使用您的示例立即尝试。然后我会修改它以供我使用。非常感谢!
  • R for Data Science 是一个很好的资源,可以帮助您了解 tidyverse 的来龙去脉。
  • 太棒了,感谢您分享此资源@DaveArmstrong!我检查了本网站其他地方发布的一些链接,但这些资源不再可用,即网页是空白的。周末休息愉快!
  • 嗨,戴夫,我注意到当我尝试您提供的解决方案时,新格式化的数据框将所有 19 个 col1 迭代地添加在一起,然后将所有 19 个 col2 放在一起。有没有办法确保每个单独数据集中的第 1 列和第 2 列彼此相邻?
【解决方案2】:

致对解决方案感兴趣的任何人:

DaveArmstrong 的解决方案使我能够水平排列数据。但是,它将 col 1 和 col 2 组合在一起。我想将每个数据集中的第 1 列和第 2 列配对在一起。我提供了脚本的屏幕截图(附在此消息中)以及需要在 Dave 的脚本中实现的附加行。

Full Solution

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多