【问题标题】:How to reference columns of a data.frame within a data.frame?如何在 data.frame 中引用 data.frame 的列?
【发布时间】:2011-01-20 16:54:51
【问题描述】:

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

我只能取出一组:例如series_to_plot.df[[3]] 和另一个由 series_to_plot.df[[10]](所以它只是一个向量列表..),我可以直接使用 series_to_plot.df$p3c3.mm 进行引用,但是是否有一个命令可以从每个数据中获取一个包含所有 mm 的向量。框架?我期待这样的索引可以工作:series_to_plot.df[,3[3]] 但它返回错误[.data.frame(series_to_plot.df, , 3[3]) : undefined columns selected

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

【问题讨论】:

  • 你确定 series_to_plot.df 是一个数据框吗?当我阅读您的评论并查看输出时,我想知道它是包含多个数据帧的列表还是向量。我不确定为什么您的输出每 3 行显示一次列标题并且行号从头开始。测试结构运行 str(series_to_plot.df)
  • 谢谢,是的,它是一个 data.frame,它是另一个 data.frame 中的一组 data.frames。但你是对的,这不是最好的数据结构,我在这里找到了一些关于最佳结构的提示:stackoverflow.com/questions/1181060/…

标签: r dataframe


【解决方案1】:

为了补充其他答案,我认为在变量名中编码有用的信息不是一个好主意。重新排列数据要好得多,这样所有有用的信息都在某个变量的值中。我对您的数据集了解不多,无法建议正确的格式,但可能类似于

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

完成此操作后,您的问题的答案就变成了简单的df$mm

如果您从外部来源以不太有用的形式获取数据,您可以在 R 中使用reshape 函数或reshape 包中的函数以更有用的形式重新排列它。

【讨论】:

  • 我也尝试在我的回答中提出建议,但我认为 pxcy 是部分 data.frame 的名称(即 rbind/cbind 的东西)。但是您将部分名称包含为新列的提示非常好。
  • 谢谢,我会尝试融化和重塑...(另见stackoverflow.com/questions/1181060/…
【解决方案2】:

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

然后您可以使用 grep() 命令提取与序列匹配的名称。然后像这样把它们串在一起:

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

稍微解构一下,这将获取与“mm”模式匹配的列数:

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

然后我们使用该列表来调用我们想要的列:

  dataWithMM <- series_to_plot.df[, namesThatMatch ]

【讨论】:

  • Marek 的答案比我的有更好的正则表达式。 “[mm]”将匹配任何带有“mm”的列。 "mm$" 将仅匹配以 "mm" 结尾的列,这可能更合适。
【解决方案3】:

要获取具有指定名称的所有列,您可以这样做:

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)
)

然后mm 值在一列中,更容易绘制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2015-01-18
    • 2023-03-31
    相关资源
    最近更新 更多