我有一个数据框(data1
),其结构是:
Time-period income
Jan.2000 15000
Jan.2000 23000
Jan.2000 17400
Jan.2000 11111
. .
. .
Feb.2000 37000
Feb.2001 39000
Mar.2001 39000
Mar.2001 39000
. .
. .
因此,对于每个月和每年,数据框n
中都有data1
个条目。 我想要的是,每年的每个月应该只有2个(前2个,如果超过2个)条目。因此,对于Jan. 2000
,我希望只有前2个条目,并从数据框data1
中删除其余条目。同样,每年每个月都有两个以上的条目。我怎么做?
更新:以下是我的示例数据集:
Time-period income
Jan.2000 15000
Jan.2000 23000
Jan.2000 17400
Feb.2000 37000
Feb.2000 39000
Mar.2000 39000
Mar.2000 39000
Mar.2000 39500
Jan.2000 11111
Apr.2000 39000
过滤后我应该得到:
Time-period income
Jan.2000 15000
Jan.2000 23000
Feb.2000 37000
Feb.2000 39000
Mar.2000 39000
Mar.2000 39000
Apr.2000 39000
请注意Jan. 2000
的最后两个条目(其中一个是在2000年3月之后,因此没有订购时间段)和Mar. 2000
的最后一个条目被删除但是Feb. 2000
并且Apr 2000
没有删除,因为条目数是< = 2
答案 0 :(得分:1)
使用示例data.frame
dd<-data.frame(Time.period = c("Jan.2000", "Jan.2000", "Jan.2000",
"Feb.2000", "Feb.2000", "Mar.2000", "Mar.2000", "Mar.2000", "Jan.2000",
"Apr.2000"), income = c(15000, 23000, 17400, 37000, 39000,
39000, 39000, 39500, 11111, 39000))
您可以稍微调整
运行我在评论中建议的代码do.call(rbind, by(dd, factor(dd$Time.period, levels=unique(dd$Time.period)),
head ,2))
这将返回
Time.period income
Jan.2000.1 Jan.2000 15000
Jan.2000.2 Jan.2000 23000
Feb.2000.4 Feb.2000 37000
Feb.2000.5 Feb.2000 39000
Mar.2000.6 Mar.2000 39000
Mar.2000.7 Mar.2000 39000
Apr.2000 Apr.2000 39000
它确实会创建奇怪的row.names,但如果您喜欢rownames(x)<-NULL
之类的内容,则可以根据保存结果的位置来删除它们。