我有以下数据框(只是一个例子)
Date StudentID Gender Grade
数据框架是不平衡的,因为男性比女性多得多。我需要从数据框中选择所有女性和相同数量的男性以及最新的日期条目。日期以日期类型给出。数据框未排序,并且有多个行可能具有相同的日期。 执行此任务的最佳方式是什么?
答案 0 :(得分:3)
假设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个案例。
答案 1 :(得分: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而不是其他内容,例如因素或字符。如果不是一个日期,那么您必须先将其转换才能按日期排序。