将数据帧中特定字符串的行数限制为R中的某个数字n

时间:2014-08-13 19:23:05

标签: r filter dataframe

我有一个数据框(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

1 个答案:

答案 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之类的内容,则可以根据保存结果的位置来删除它们。