2010-02-24 96 views
3

我有一个名为series_to_plot.df的数据框,它是通过将多个其他data.frames组合在一起创建的(如下所示)。我现在想要从每个这些中拉出.mm列,以便我可以绘制它们。所以我想拉出每个data.frame的第三列(例如p3c3.mm,p3c4.mm等),但是我看不到如何为对象中的所有data.frames执行此操作,而无需循环名字。这可能吗?如何引用data.frame中的data.frame的列?

我只能拉出一套:例如series_to_plot.df [[3]]和另一个由 series_to_plot.df [[10]](所以它只是一个向量列表..),我可以直接引用series_to_plot.df $ p3c3.mm,但有没有命令从每个data.frame获取包含所有mm的矢量?我期待指数是这样工作的:series_to_plot.df [3 [3],但它返回[.data.frame错误(series_to_plot.df,3 [3]):未定义列中选择

series_to_plot.df 
      p3c3.rd   p3c3.day p3c3.mm  p3c3.sd     p3c3.n p3c3.noo p3c3.no_NAs 
    1  2010-01-04    0 0.1702531 0.04003364    7    1   0 
    2  2010-01-06    2 0.1790594 0.04696674    7    1   0 
    3  2010-01-09    5 0.1720404 0.03801756    8    0   0 

      p3c4.rd   p3c4.day p3c4.mm  p3c4.sd     p3c4.n p3c4.noo p3c4.no_NAs 
    1  2010-01-04    0 0.1076581 0.006542157    6    2   0 
    2  2010-01-06    2 0.1393447 0.066758781    7    1   0 
    3  2010-01-09    5 0.2056846 0.047722862    7    1   0 

      p3c5.rd   p3c5.day p3c5.mm  p3c5.sd     p3c5.n p3c5.noo p3c5.no_NAs 
    1  2010-01-04    0 0.07987147 0.006508766    7    1   0 
    2  2010-01-06    2 0.11496167 0.046478767    8    0   0 
    3  2010-01-09    5 0.40326471 0.210217097    7    1   0 
+0

你确定series_to_plot.df是一个数据框吗?当我读你的评论,看看输出,我想知道它是一个列表或向量包含一些数据帧。我不知道为什么你的输出每3行显示列标题,行号重新开始。测试结构run str(series_to_plot.df) – 2010-02-24 20:52:40

+0

谢谢,是的,它是一个data.frame,它是另一个data.frame内的一组data.frames。但是你是正确的,这不是最好的数据结构,我在这里找到了最好的结构的一些提示:http:// stackoverflow。com/questions/1181060/reshaping-time-series-data-from-wide-to-tall-format-for-plotting – John 2010-02-25 23:27:06

回答

2

要添加到其他的答案,我不认为这是在变量名编码的有用信息是个好主意。更好地重新排列数据,以便所有有用的信息都在某个变量的值中。我不知道有足够的了解您的数据集的建议正确的格式,但它可能是这样的

p c   rd day date mm sd ... 
3 3 2010-10-04 ... 

一旦你完成这个回答你的问题变得简单df$mm

如果从外部源获得在一个不太有用的形式的数据,可以R内使用reshape功能或功能从reshape包重新排列它在一个更有用的形式,如上述。

+0

我也试过在我的回答中提出它,但我认为'pxcy'是部分data.frame(即rbind/cbind的东西)的名称。但是您的提示将新名称的部分名称包含在新列中非常好。 – Marek 2010-02-25 08:37:07

+0

谢谢,我会尝试融化和重塑...(另请参阅http://stackoverflow.com/questions/1181060/reshaping-time-series-data-from-wide-to-tall-format-for-plotting) – John 2010-02-25 23:29:41

4

要获得与指定名称的所有列,你可以这样做:

names_with_mm <- grep("mm$", names(series_to_plot.df), value=TRUE) 
series_to_plot.df[, names_with_mm] 

但是,如果你的基础data.frame的所有具有相同的结构,那么你可以rbind他们,是这样的:

series_to_plot.df <- rbind(
    cbind(name="p3c3", p3c3), 
    cbind(name="p3c4", p3c4), 
    cbind(name="p3c5", p3c5) 
) 

Then mm values are in one column and it easily to plot。

1

R Language Definition有一些关于索引的很好的信息(sec 3.4.1),这很有帮助。

然后,您可以使用grep()命令来拉取与序列匹配的名称。然后串它一起这样的:

dataWithMM <- series_to_plot.df[,grep("[P]", names(series_to_plot.df))] 

解构了一点,这得到匹配“毫米”模式的列数:

namesThatMatch <- grep("[mm]", names(series_to_plot.df) 

然后我们使用该列表来调用列,我们希望:

dataWithMM <- series_to_plot.df[, namesThatMatch ] 
+0

Marek的答案比我的更好的正则表达式。 “[mm]”将与任何地方的“mm”列匹配。 “mm $”只会匹配以“mm”结尾的列,这可能更合适。 – 2010-02-24 20:49:34