melt a data.table with a column pattern

时光怂恿深爱的人放手 提交于 2019-11-30 22:06:23
42-

I raise my glass to @rawr who apparently understands the base-R reshape-function. For me it is an eternal mystery, despite many efforts at understanding its documentation and many efforts at solving problems with it. Despite my general disdain for the hadleyverse efforts at "simplifying" (but for me obfuscating) R by universal "nonstandardization", I find his invention of the reshape2::melt-function to be a great aid in efficient manipulation.

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

So:

> 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

I can suggest an easy dplyr+tidyr solution.

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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!