【问题标题】:subsetting a dataframe by columnames which are dates按日期的列名子集数据框
【发布时间】:2018-09-01 11:54:24
【问题描述】:

我想根据行名中的日期对data.frame 进行子集化。我的日期是这种格式:

192707
192708
192709

df$Date <- as.yearmon(as.character(df$Date), "%Y%m")

编辑:我将行名设置为等于这样的日期变量(然后想删除日期):

rownames(df)<-df$Date

我想到了这样的子集:

 train_dates <- seq(as.yearmon(as.character("1959-12-31"), "%Y%m"), as.yearmon(as.character("1984-12-31"), "%Y%m", "months"))
 df <- subset(df, rownames(df) %in% train_dates)

 df[train_dates,]

但我很难创建正确的序列。

【问题讨论】:

  • 我会从你的行名中创建一个列,然后使用 lubridate 包很容易完成子集
  • 我实际上试图避免这种情况。实际上,我从现有列创建了行名,并且我想删除该日期列,因为每次我对数据框的其余部分进行一些计算时,我都必须将其过滤掉。

标签: r date dataframe subset


【解决方案1】:

一种解决方案是使用来自tibble 包的rownames_to_column

  #data
  df <- data.frame(A = 1:5, B = letters[1:5])
  rownames(df) <- c("195901", "196008", "196109", "201812", "196112")
  #        A B
  # 195901 1 a
  # 196008 2 b
  # 196109 3 c
  # 201812 4 d   # not in train_dates
  # 196112 5 e  

  library(zoo)
  #create sequence from 1959 to 1968. Lookup table
  train_dates <- format(as.yearmon(1959 + seq(0, 119)/12), format="%Y%m") 

选项 #1:

  library(tidyverse)

  df %>%
    rownames_to_column("datemon") %>%
    filter(datemon %in% train_dates) %>%
    column_to_rownames("datemon")

  #        A B
  # 195901 1 a
  # 196008 2 b
  # 196109 3 c
  # 196112 5 e  

选项 #2

  df[rownames(df) %in% train_dates, ]
  #        A B
  # 195901 1 a
  # 196008 2 b
  # 196109 3 c
  # 196112 5 e  

【讨论】:

  • 也很好,我会把它添加到我的个人备忘单中!!
  • @NiccolaTartaglia 谢谢!但我更喜欢我添加为 Option#2 的 base-R 版本。最初我以为您正在以不同的方式寻找选项,为此我添加了 Option#1。
【解决方案2】:

尝试使用format

 train_dates <- format(seq(as.Date.character('1959-01-31'),
                       as.Date.character('1959-12-31'), by = 'month'), '%Y%m')

然后,使用library(data.table)

df <- as.data.table(df)    
train_df <- df[Date %in% train_dates]

【讨论】:

  • 这不起作用,因为数据表是空的。我的日期可能不同吗?因为从数据框行名中打印出我的日期:print(rownames(df)),给了我这个:“Mar 1959”“Apr 1959”“May 1959”“Jun 1959”等
  • 但是打印 train_dates 给了我这个:“195901”“195903”“195903”“195905”
  • 所以在改变 train_dates 后,它的工作方式相同:
  • train_dates
猜你喜欢
  • 1970-01-01
  • 2021-10-26
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2017-03-18
  • 1970-01-01
  • 2013-07-16
相关资源
最近更新 更多