【问题标题】:remove/subset or select columns based on a part of the header name根据标题名称的一部分删除/子集或选择列
【发布时间】:2016-11-08 12:28:26
【问题描述】:

我有一个 15000 obs 的数据框。 45 个变量,具有与下面给出的示例输入数据帧类似的结构/模式/类。

我想要做的是选择“日期”列+包含“_MIN”的列作为标题的一部分,并将它们放入一个新的df中。 & 选择“日期”列 + 包含“_MIN”的列作为标题的一部分,并将它们放入新的 df 中。

所以我基本上是在寻找一种基于列标题名称的一部分来选择或子集整个列的方法。示例:多个列包含“_”下划线我想删除或选择这些列。

INPUT dataframe:
Example <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"), by="day"), ca_MIN=1:5, ca_MAX=2:6, cb_MIN=3:7, cb_MAX=4:8)

>Example

    Date                  ca_MIN     ca_MAX     cb_MIN     cb_MAX
    1 1979-01-01          1          2          3          4
    2 1979-01-02          2          3          4          5
    3 1979-01-03          3          4          5          6
    4 1979-01-04          4          5          6          7
    5 1979-01-05          5          6          7          8

OUTPUT dataframes, selected based on the column names "_MAX", "_MIN":
Example_MIN <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"),     by="day"), ca_MIN=1:5, cb_MIN=3:7)
Example_MAX <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"), by="day"), ca_MAX=2:6, cb_MAX=4:8)

>Example_MIN

    Date            ca_MIN cb_MIN
  1 1979-01-01      1      3
  2 1979-01-02      2      4
  3 1979-01-03      3      5
  4 1979-01-04      4      6
  5 1979-01-05      5      7

目前它适用于:

Example_MIN <-Example 
Example_MAX <-Example
subset(ExampleMIN,select=-c(2,4))
subset(ExampleMAX,select=-c(3,5))

然而,这给我一个大型数据集的错误(尽管结果对我有用):

Error in `[.data.table`(x, r, vars, with = FALSE) : j out of bounds

有没有更简单的方法来做到这一点?

我希望它也可以处理具有大量列的数据集以及列“_MIN”和“_MAX”未排序为奇数和偶数列号?

我看到了相关的帖子,但我还没有设法创建有效的代码......

【问题讨论】:

  • Example[grepl("_MIN", names(Example))]Example[grepl("_MAX", names(Example))]
  • 从错误消息来看,它看起来像data.table。在那种情况下Example[, grepl("_MIN", names(Example)), with = F]
  • @Ronak Shah。是的,显然在我的脚本中的某个地方,我的 data.frame 变成了 data.table。这就是为什么我之前的尝试没有奏效。感谢您指出了这一点。下次我执行操作时会记住这一点:)

标签: r dataframe subset


【解决方案1】:

有几种方法可以做到这一点。

grepl("_",names(Example) 将为您提供这些列的真假列表,因此:

Example[,grepl("_",names(Example)] 将为您提供正确的子集 data.frame。

更友好的方式是使用 dplyr:

Example %&gt;% select(contains("_"))

然后你的练习将是如何选择这些列和日期列。基本 R 解决方案的提示:| 是 OR,&amp; 是逻辑 AND。祝你好运!

【讨论】:

  • 我使用了 'Example.max
  • 关闭...但您可以做得更好...尝试将两个条件合二为一...所以Example[,CONDITIONS]。其中条件是“_”和“日期”。尝试...一步指定多个过滤器对您的 R 技能非常重要。如果你不能得到它,我会告诉你怎么做。另外,一定要试试 dplyr 的方式……如果你不知道 dplyr,你应该学习!
  • 我之前用过dplyr包,但是好像不能把两个功能结合起来。我对 R 比较陌生,所以我可能大部分时间工作效率低下...... dplyr 包将使用 bind_cols 而不是 cbind 对吗?也许使用 select_if 来选择列??
  • 我已经使用 dplyr 为您提供了解决方案......再看看我的答案。不要担心对 R 来说是新手……我们有时都是 R 的新手。 :) 我建议做几个 dplyr 教程......初学者比基础 R 更容易学习。祝你好运!如果您还有其他问题,请不要害怕问我。
【解决方案2】:

在名称上尝试 grep,诀窍是对日期列也进行适当的 $ref

Example_MIN <- Example[ , c(Example$Date, grep('_MIN', names(Example)))]

【讨论】:

  • 在我的数据集中生成以下错误: grep("_MAX") 中的错误:缺少参数 "x",没有默认值
【解决方案3】:

你可以使用stringr包并从列名向量中选择:

Example <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"), by="day"), ca_MIN=1:5, ca_MAX=2:6, cb_MIN=3:7, cb_MAX=4:8)
library(stringr)
# columns including MIN
chosenColumns <- str_detect(names(Example), "MIN")
#include also dates
chosenColumns[1] <- TRUE
mins <- Example[, chosenColumns]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2018-06-04
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多