【问题标题】:What is the elegant way to select n latest (by date) entries in data.frame in R?在 R 中的 data.frame 中选择 n 个最新(按日期)条目的优雅方法是什么?
【发布时间】:2015-11-22 23:14:12
【问题描述】:

我有以下数据框(只是一个例子)

Date StudentID Gender Grade

从某种意义上说,数据框是不平衡的,男性明显多于女性。我需要从数据框中选择所有女性和相同数量的男性以及最新的日期条目。日期以日期类型给出。数据框未排序,并且有多行可能具有相同的日期。 执行此任务最优雅的方式是什么?

【问题讨论】:

  • 您首先应该提供一个可重现的示例,而不是期望其他人为您完成所有工作。

标签: r dataframe


【解决方案1】:

假设dat 是您的数据框,它是由Date 排序的,您可以使用:

rbind(tail(dat[dat&Gender=="Male",], 10),
      tail(dat[dat&Gender=="Female",], 10))

或:

library(data.table)
setDT(dat)[, tail(.SD, 10) , by = Gender]

或:

library(dplyr)
dat %>% group_by(Gender) %>% do(tail(., 10))

每个人都会为两组选择最后 10 个案例。

【讨论】:

  • 如果数据框不是按日期排序的,我更喜欢保持这种方式(按其他列排序)怎么办?
  • 那么请确保您没有更改原始数据框。
  • @Sasha 如果您想选择最新的Date 条目,您必须以某种方式通过Date 进行排序;无论是在新数据框中还是在原始数据框中。之后您可以随时将其更改回原来的顺序。
【解决方案2】:

以下是为男性创建数据框的方法:

# subset all male records
df1     <- df[df$Gender == 'Male', ]

# sort by date in descending order (most recent first)
df2     <- df1[rev(order(df1$Date)),]

# retain same number of rows as number of females
df.male <- df2[1:sum(df$Gender == 'Female'), ]

要为女性创建数据框,您只需要这样:

df.female <- df[df$Gender == 'Female', ]

您可以使用以下方法将它们组合起来:

df.all <- rbind(df.male, df.female)

请注意,我假设您的 Date 列实际上已经属于 Date 类,而不是其他东西,例如因素或字符。如果它不是日期,那么您必须先转换它才能按日期排序。

【讨论】:

    猜你喜欢
    • 2016-08-03
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多