Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R的data.frame中选择n个最新(按日期)条目的优雅方式是什么?_R_Dataframe - Fatal编程技术网

在R的data.frame中选择n个最新(按日期)条目的优雅方式是什么?

在R的data.frame中选择n个最新(按日期)条目的优雅方式是什么?,r,dataframe,R,Dataframe,下面的数据框只是一个示例 Date StudentID Gender Grade 从某种意义上讲,数据框架是不平衡的,即男性明显多于女性。我需要从数据框中选择所有女性和具有最新日期条目的相同数量的男性。日期以日期类型给出。数据帧未排序,并且有多行可能具有相同的日期。 执行此任务最优雅的方式是什么?以下是如何为男性创建数据框: # subset all male records df1 <- df[df$Gender == 'Male', ] # sort by date in

下面的数据框只是一个示例

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

以下是如何为男性创建数据框:

# 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)
请注意,我假设您的日期列实际上已经是类日期,而不是其他内容,如因子或字符。如果它不是日期,则必须首先转换它,以便按日期排序。

假设dat是您的数据帧,并按日期排序,则可以使用:

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

或:


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

如果数据框不是按日期排序的,而我更喜欢按其他列排序,该怎么办?然后只需确保不更改原始数据框。@Sasha如果要选择最新的日期条目,必须按日期排序;无论是在新数据帧中还是在原始数据帧中。你可以随时将它更改回原来的顺序。你首先应该提供一个可复制的例子,而不是期待其他人为你做所有的工作。
library(data.table)
setDT(dat)[, tail(.SD, 10) , by = Gender]
library(dplyr)
dat %>% group_by(Gender) %>% do(tail(., 10))