从长格式转换为扩展的一行

时间:2017-10-17 13:20:56

标签: r data.table

尝试将一些标签数据转换为一个展开的行,其中名称由连接到“by”列的值的列名形成...以紧凑/优雅的方式...

MWE更容易,它使用data.table但可以是任何东西(尽管data.table首选):

library(data.table)
# input
bar <- data.table(c1 = c(1L, 2L), c2 = c(3L, 4L), c3 = c("aa", "bb"))
# output
baz <- data.table(c1_aa = 1L, c1_bb = 2L, c2_aa = 3L, c3_bb = 4L)

所以输入是:

> bar
   c1 c2 c3
1:  1  3 aa
2:  2  4 bb

并且所需的输出是:

> baz
   c1_aa c1_bb c2_aa c3_bb
1:     1     2     3     4

2 个答案:

答案 0 :(得分:3)

这是@ useR回答的data.table模拟

dcast(melt(bar, id="c3"), . ~ variable + c3)

由于dcast默认值(在列排序和使用_作为分隔符时),它恰好很短。

答案 1 :(得分:2)

不是data.table,但与dplyr + tidyr配合得很好:

library(dplyr)
library(tidyr)

bar %>%
  gather(variable, value, c1:c2) %>%
  unite(variable, variable, c3, sep = "_") %>%
  spread(variable, value)

<强>结果:

  c1_aa c1_bb c2_aa c2_bb
1     1     2     3     4