在 R 中格式化 table

Formatting a table in R

我有

这样的数据
            147 147 231 231
2011_15_1   99  106 152 156
2011_15_2   99  102 150 156
2011_15_3   99  99  152 156
2011_15_7   99  106 152 156

我想将其重新格式化为:

            147     231
2011_15_1   99      152
            106     156
2011_15_2   99      150
            102     156
2011_15_3   99      152
            99      156
2011_15_7   99      152
            106     156

我已经尝试将 table 读入 R 并使用 'reshape2' 包和 melt() 函数,但我不确定如何将同名的列折叠成 narrow-形式。

有人可以帮忙吗?

您可以使用 dplyr + tidyr.

library(tidyr)
library(dplyr)

df %>%
  mutate(date = row.names(.)) %>%
  gather(key, value, -date) %>%
  arrange(date) %>%
  mutate(key = gsub("[.]1$", "", key)) %>%
  group_by(date, key) %>%
  mutate(id = 1:n()) %>%
  spread(key, value) %>%
  select(-id)

结果:

# A tibble: 8 x 3
# Groups:   date [4]
       date  X147  X231
*     <chr> <int> <int>
1 2011_15_1    99   152
2 2011_15_1   106   156
3 2011_15_2    99   150
4 2011_15_2   102   156
5 2011_15_3    99   152
6 2011_15_3    99   156
7 2011_15_7    99   152
8 2011_15_7   106   156

注:

  1. read.table在读入数据时对列名做了两次转换:在前面附加X.1作为重复列名的后缀。这是因为纯数字和相同的列名均无效。
  2. 我基本上做的是首先将行名转换为第一列 date,
  3. 将数据从宽格式转换为长格式 (gather),
  4. 删除key列中的所有.1后缀,
  5. 添加了一个 idgroup_by datekey 使每一行都是唯一的,
  6. 然后使用新的 keyvalue 列最终将数据转换回宽格式 (spread)。

数据:

df = read.table(text="         147 147 231 231
                2011_15_1   99  106 152 156
                2011_15_2   99  102 150 156
                2011_15_3   99  99  152 156
                2011_15_7   99  106 152 156", header = TRUE)