将不等长的矢量组合成数据帧

时间:2010-07-29 18:38:16

标签: r

我有一个矢量列表,它们是不等长度的时间序列。我的最终目标是在ggplot2图表中绘制时间序列。我想我最好首先合并数据帧中的向量(其中较短的向量将使用NA扩展),也因为我想以表格格式(例如.csv)导出数据以供其他人阅读。

我有一个列表,其中包含 所有向量的名称。列标题可以由第一个向量设置,这是最长的。 E.g:

> mylist
[[1]]
[1] "vector1"

[[2]]
[1] "vector2"

[[3]]
[1] "vector3"

我知道要走的路是使用Hadley的plyr包,但我想问题是我的列表包含向量的名称,而不是向量本身,所以如果我输入:

do.call(rbind, mylist)

我得到一个包含我想要合并的dfs名称的单列df。

> do.call(rbind, actives)
      [,1]           
 [1,] "vector1" 
 [2,] "vector2" 
 [3,] "vector3" 
 [4,] "vector4" 
 [5,] "vector5" 
 [6,] "vector6" 
 [7,] "vector7" 
 [8,] "vector8" 
 [9,] "vector9" 
[10,] "vector10"

即使我自己创建了一个包含对象的列表,我也会得到一个空数据框:

mylist <- list(vector1, vector2)
mylist
[[1]]
        1         2         3         4         5         6         7         8         9        10        11        12 
0.1875000 0.2954545 0.3295455 0.2840909 0.3011364 0.3863636 0.3863636 0.3295455 0.2954545 0.3295455 0.3238636 0.2443182 
       13        14        15        16        17        18        19        20        21        22        23        24 
0.2386364 0.2386364 0.3238636 0.2784091 0.3181818 0.3238636 0.3693182 0.3579545 0.2954545 0.3125000 0.3068182 0.3125000 
       25        26        27        28        29        30        31        32        33        34        35        36 
0.2727273 0.2897727 0.2897727 0.2727273 0.2840909 0.3352273 0.3181818 0.3181818 0.3409091 0.3465909 0.3238636 0.3125000 
       37        38        39        40        41        42        43        44        45        46        47        48 
0.3125000 0.3068182 0.2897727 0.2727273 0.2840909 0.3011364 0.3181818 0.2329545 0.3068182 0.2386364 0.2556818 0.2215909 
       49        50        51        52        53        54        55        56        57        58        59        60 
0.2784091 0.2784091 0.2613636 0.2329545 0.2443182 0.2727273 0.2784091 0.2727273 0.2556818 0.2500000 0.2159091 0.2329545 
       61 
0.2556818 

[[2]]
        1         2         3         4         5         6         7         8         9        10        11        12 
0.2824427 0.3664122 0.3053435 0.3091603 0.3435115 0.3244275 0.3320611 0.3129771 0.3091603 0.3129771 0.2519084 0.2557252 
       13        14        15        16        17        18        19        20        21        22        23        24 
0.2595420 0.2671756 0.2748092 0.2633588 0.2862595 0.3549618 0.2786260 0.2633588 0.2938931 0.2900763 0.2480916 0.2748092 
       25        26        27        28        29        30        31        32        33        34        35        36 
0.2786260 0.2862595 0.2862595 0.2709924 0.2748092 0.3396947 0.2977099 0.2977099 0.2824427 0.3053435 0.3129771 0.2977099 
       37        38        39        40        41        42        43        44        45        46        47        48 
0.3320611 0.3053435 0.2709924 0.2671756 0.2786260 0.3015267 0.2824427 0.2786260 0.2595420 0.2595420 0.2442748 0.2099237 
       49        50        51        52        53        54        55        56        57        58        59        60 
0.2022901 0.2251908 0.2099237 0.2213740 0.2213740 0.2480916 0.2366412 0.2251908 0.2442748 0.2022901 0.1793893 0.2022901 

do.call(rbind.fill, mylist)
data frame with 0 columns and 0 rows

我尝试将向量转换为数据帧,但没有cbind.fill函数,因此plyr抱怨数据帧的长度不同。

所以我的问题是:

  • 这是最好的方法吗?请记住,目标是a)ggplot2图表和b)具有时间序列的表格,可在R之外查看

  • 获取以这些对象名称列表开头的对象列表的最佳方法是什么?

  • 突出60个时间序列模式的最佳图形类型是什么?规模是相同的,但我预测会有很多过度绘图。由于这是一个队列分析,因此使用颜色突出显示新近度(作为连续变量)的不同群组可能是有用的。但是如何避免过度绘图呢?差异很小,因此可能会让观众无法掌握差异。

3 个答案:

答案 0 :(得分:11)

我认为你可能会以错误的方式接近这个:

如果你有不等长度的时间序列,那么最好的办法是将它们保持为时间序列并merge。大多数时间序列包允许这样做。因此,您最终会得到一个多变量的时间序列,并且每个值都将与相同的日期正确关联。

因此,将时间序列放入zoo个对象,merge,然后使用my qplot.zoo function绘制它们。这将涉及从zoo切换到长数据帧。

以下是一个例子:

> z1 <- zoo(1:8, 1:8)
> z2 <- zoo(2:8, 2:8)
> z3 <- zoo(4:8, 4:8)
> nm <- list("z1", "z2", "z3")
> z <- zoo()
> for(i in 1:length(nm)) z <- merge(z, get(nm[[i]]))
> names(z) <- unlist(nm)
> z
  z1 z2 z3
1  1 NA NA
2  2  2 NA
3  3  3 NA
4  4  4  4
5  5  5  5
6  6  6  6
7  7  7  7
8  8  8  8
> 
> x.df <- data.frame(dates=index(x), coredata(x))
> x.df <- melt(x.df, id="dates", variable="val")
> ggplot(na.omit(x.df), aes(x=dates, y=value, group=val, colour=val)) + geom_line() + opts(legend.position = "none")

答案 1 :(得分:3)

如果你这样做只是因为ggplot2(以及许多其他事情)比如数据帧那么你缺少的是你需要长格式数据帧中的数据。是的,您只需将所有响应变量放在一个连接在一起的列中。然后,您将拥有一个或多个其他列,以确定这些响应的不同之处。这是为ggplot设置它的最好方法。

答案 2 :(得分:0)

你做不到。 data.frame()必须是矩形的;但回收规则确保较短的向量得到扩展。

所以你可能在这里遇到了不同的错误 - 你想要rbind的数据不合适吗? - 但很难说,因为你没有提供可重复的例子。

修改根据您的更新,您正好您要求的内容:名称列表由rbind合并。如果您希望显示基础数据,则需要涉及get()或其他数据访问者。