删除/子集或根据标题名称

时间:2016-11-08 12:28:26

标签: r dataframe subset

我的数据帧为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”&amp; “_MAX”没有排序为奇数和偶数列号?

我看过相关的帖子,但我还没有做到这一点,以创建一个有效的代码......

3 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。

grepl("_",names(Example)会为您提供这些列的真实和谬误列表,所以:

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

更友好的方法是使用dplyr:

Example %>% select(contains("_"))

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

答案 1 :(得分:0)

尝试grep on names,诀窍就是对日期列做一个正确的$ ref

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

答案 2 :(得分:0)

你可以使用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]