假设我有一个包含时间序列数据的数据框,其中第一列是索引,其余列都包含不同的数据流,并且描述性地命名,如下例所示:
temps = data.frame(matrix(1:20,nrow=2,ncol=10))
names(temps) <- c("flr1_dirN_areaA","flr1_dirS_areaA","flr1_dirN_areaB","flr1_dirS_areaB","flr2_dirN_areaA","flr2_dirS_areaA","flr2_dirN_areaB","flr2_dirS_areaB","flr3_dirN_areaA","flr3_dirS_areaA")
temps$Index <- as.Date(2013,7,1:2)
temps
flr1_dirN_areaA flr1_dirS_areaA ... Index
1 1 3 ... 1975-07-15
2 2 4 ... 1975-07-16
现在我想准备用于使用ggplot2进行绘图的数据框,我想包括三个因素:flr
,dir
和area
。
我可以通过以下简单示例实现此目的:
temps.m <- melt(temps,"Index")
temps.m$flr <- factor(rep(1:3,c(8,8,4)))
temps.m$dir <- factor(rep(c("N","S"),each=2,len=20))
temps.m$area <- factor(rep(c("A","B"),each=4,len=20))
temps.m
Index variable value flr dir area
1 1975-07-15 flr1_dirN_areaA 1 1 N A
2 1975-07-16 flr1_dirN_areaA 2 1 N A
3 1975-07-15 flr1_dirS_areaA 3 1 S A
4 1975-07-16 flr1_dirS_areaA 4 1 S A
5 1975-07-15 flr1_dirN_areaB 5 1 N B
6 1975-07-16 flr1_dirN_areaB 6 1 N B
7 1975-07-15 flr1_dirS_areaB 7 1 S B
8 1975-07-16 flr1_dirS_areaB 8 1 S B
9 1975-07-15 flr2_dirN_areaA 9 2 N A
10 1975-07-16 flr2_dirN_areaA 10 2 N A
11 1975-07-15 flr2_dirS_areaA 11 2 S A
12 1975-07-16 flr2_dirS_areaA 12 2 S A
13 1975-07-15 flr2_dirN_areaB 13 2 N B
14 1975-07-16 flr2_dirN_areaB 14 2 N B
15 1975-07-15 flr2_dirS_areaB 15 2 S B
16 1975-07-16 flr2_dirS_areaB 16 2 S B
17 1975-07-15 flr3_dirN_areaA 17 3 N A
18 1975-07-16 flr3_dirN_areaA 18 3 N A
19 1975-07-15 flr3_dirS_areaA 19 3 S A
20 1975-07-16 flr3_dirS_areaA 20 3 S A
实际上,我有不同长度的数据流(列) - 每个都来自它自己的文件,缺少数据,列(文件)名称中编码的因子超过3个,所以这个简单的应用因子的方法不行。我需要更强大的东西,我倾向于将变量名称解析为不同的因子,并填充融化数据框的因子列。
我的最终目标是绘制这样的内容:
ggplot(temps.m,aes(x=Index,y=value,color=area,linetype=dir))+geom_line()+facet_grid(flr~.)
我想重塑,reshape2,plyr或其他一些软件包可以在一两个语句中做到这一点 - 但我在使用melt / cast / ddply和其他语句时会遇到困难。有什么建议?
另外,如果您可以建议一种完全不同的[更好]的方法来构建我的数据,我会全力以赴。
提前致谢
答案 0 :(得分:2)
您可以使用一些正则表达式来创建因子:
res <- do.call(rbind,strsplit(gsub('flr([0-9]+).*dir([A-Z]).*area([A-Z])',
'\\1,\\2,\\3',
temps.m$variable),
','))
[,1] [,2] [,3]
[1,] "1" "N" "A"
[2,] "1" "N" "A"
[3,] "1" "S" "A"
[4,] "1" "S" "A"
[5,] "1" "N" "B"
[6,] "1" "N" "B"
[7,] "1" "S" "B"
[8,] "1" "S" "B"
........
也许您需要进一步的步骤将列转换为因素。
res <- colwise(as.factor)(data.frame(res))
X1 X2 X3
1 1 N A
2 1 N A
3 1 S A
4 1 S A
........
要将结果与您的融化数据相结合,您可以使用cbind
temps.m <- cbind(temps.m,res)
答案 1 :(得分:1)
这是一种将一堆格式合适的字符串转换为因子变量数据帧的方法。这假设因子被_
分割,并且每个子字符串中的最后一个字符是所需的级别。
require(plyr)
v <- do.call(rbind, strsplit(as.character(temps.m$variable), "_"))
v <- alply(v, 2, function(x) {
n <- nchar(x)
name <- substr(x, 1, n - 1)[1]
lev <- substr(x, n, n)
structure(factor(lev), name=name)
})
names(v) <- sapply(v, attr, "name")
temps.m <- cbind(temps.m, as.data.frame(v))
增加更多的一般性是留给读者的练习。