【问题标题】:Combining vectors of unequal length into a data frame将长度不等的向量组合成一个数据框
【发布时间】:2010-07-29 18:38:15
【问题描述】:

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

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

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

[[2]]
[1] "vector2"

[[3]]
[1] "vector3"

等等

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

do.call(rbind, mylist)

我得到一个包含我想要合并的 df 名称的单列 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 个时间序列模式的最佳图表类型是什么?比例是一样的,但我预测会有很多过度绘制。由于这是一个群组分析,因此使用颜色来突出显示不同群组的新近度(作为连续变量)可能很有用。但是如何避免过度绘制?差异将很小,因此刻面可能会使观看者无法掌握差异。

【问题讨论】:

  • 你不能那样做。坚持使用列表,因为它们可以处理可变长度的向量。不过,我不明白你想要达到什么目的......
  • 我已经编辑了这个问题,提供了更多的背景信息。对于造成的混乱,我深表歉意。
  • 在你的问题中,第三个问题更适合在这里问:stats.stackexchange.com

标签: r


【解决方案1】:

我认为您可能以错误的方式处理此问题:

如果您有长度不等的时间序列,那么绝对最好的做法是将它们保留为时间序列并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")

【讨论】:

  • Shane:感谢您提供另一种方法。当我有一个包含所有名称的列表时,合并对象的语法是什么?
  • 另外我应该添加矢量名称不是日期,但从快速查看文档来看,我认为 zoo 对此不可知
【解决方案2】:

如果您这样做只是因为 ggplot2(以及许多其他东西)喜欢数据帧,那么您缺少的是您需要长格式数据帧中的数据。是的,您只需将所有响应变量放在一起串联的一列中。然后,您将有 1 个或多个其他列来确定使这些响应不同的原因。这是为 ggplot 之类的东西设置它的最佳方式。

【讨论】:

    【解决方案3】:

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

    所以你在这里可能有一个不同的错误——你想rbind的数据不合适,也许吧? -- 但很难说,因为您没有提供可重现的示例。

    编辑根据您的更新,您准确地获得了您所要求的内容:名称列表由rbind 组合而成。如果您希望底层数据出现,则需要涉及get() 或其他数据访问者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 2020-09-18
      • 2017-12-13
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多