用柱状图案融化 data.table
melt a data.table with a column pattern
我有一个 data.table
看起来像这样:
id A1g_hi A2g_hi A3g_hi A4g_hi
1 2 3 4 5
...
我想 melt
这个 table 看起来像这样:
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
函数可以做到这一点?
我向显然理解 base-R reshape
函数的@rawr 举杯。对我来说,它是一个永恒的谜,尽管我付出了很多努力来理解它的文档,也付出了很多努力来解决它的问题。尽管我对 hadleyverse 在 "simplifying" 上的努力(但对我来说是混淆)普遍不屑一顾 "nonstandardization",但我发现他发明的 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
我可以提出一个简单的 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
我有一个 data.table
看起来像这样:
id A1g_hi A2g_hi A3g_hi A4g_hi
1 2 3 4 5
...
我想 melt
这个 table 看起来像这样:
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
函数可以做到这一点?
我向显然理解 base-R reshape
函数的@rawr 举杯。对我来说,它是一个永恒的谜,尽管我付出了很多努力来理解它的文档,也付出了很多努力来解决它的问题。尽管我对 hadleyverse 在 "simplifying" 上的努力(但对我来说是混淆)普遍不屑一顾 "nonstandardization",但我发现他发明的 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
我可以提出一个简单的 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