使用列模式融合data.table

时间:2016-03-11 00:22:04

标签: r data.table reshape reshape2

我的data.table看起来像这样:

id A1g_hi A2g_hi A3g_hi A4g_hi
1  2      3      4      5
...

我想melt这张桌子看起来像这样:

id time hi
1  1    2
1  2    3
1  3    4
1  4    5
...

我尝试过这样的事情:

melt(dtb, measure.vars = patterns("^A"), value.name = "hi", variable.name="time")

哪个不给我想要的东西。我是否需要在这里求助于字符串拆分,或者是否存在执行此操作的本地data.table函数?

2 个答案:

答案 0 :(得分:8)

我把我的杯子提升到显然理解基础-R reshape - 函数的@rawr。对我而言,这是一个永恒的谜团,尽管他们在理解其文档方面付出了许多努力,并为解决问题做出了许多努力。尽管我一直鄙视那些简化"简化" (但是对于我来说是混淆)R通过普遍"非标准化",我发现他reshape2::melt函数的发明对于有效操作是一个很好的帮助。

require(reshape2)
> melt(dat, id.var="id")
  id variable value
1  1   A1g_hi     2
2  1   A2g_hi     3
3  1   A3g_hi     4
4  1   A4g_hi     5
> str(melt(dat, id.var="id"))
'data.frame':   4 obs. of  3 variables:
 $ id      : int  1 1 1 1
 $ variable: Factor w/ 4 levels "A1g_hi","A2g_hi",..: 1 2 3 4
 $ value   : int  2 3 4 5

所以:

> dat2[[2]] <- as.numeric(dat2[[2]])
> dat2
  id variable value
1  1        1     2
2  1        2     3
3  1        3     4
4  1        4     5

答案 1 :(得分:1)

我可以建议一个简单的dplyr + tidyr解决方案。

library(data.table)
library(dplyr)
library(tidyr)

dt <- as.data.table(read.table(text = "id A1g_hi A2g_hi A3g_hi A4g_hi
1  2      3      4      5", header = T))

dt %>% gather(time, hi, -id) %>% mutate(time = extract_numeric(time))

  id time hi
1  1    1  2
2  1    2  3
3  1    3  4
4  1    4  5