値の発生に基づいて、データ フレームのサブセットを取得しようとしています。これは、以下に示す例で最もよく説明されています。この質問は、R のデータ フレーム内の列の一意の値ごとに上位の有限数の行を選択することと高い関係があります 。ただし、head() コマンドで選択される項目の数を変更したいです。
#Sample data
input <- matrix( c(1000001,1000001,1000001,1000001,1000001,1000001,1000002,1000002,1000002,1000003,1000003,1000003,100001,100002,100003,100004,100005,100006,100002,100003,100007,100002,100003,100008,"2011-01-01","2011-01-02","2011-01-01","2011-01-04","2011-01-01","2011-01-02","2011-01-01","2011-01-04","2011-01-01","2011-01-02","2011-01-01","2011-01-04"), ncol=3)
colnames(input) <- c( "Product" , "Something" ,"Date")
input <- as.data.frame(input)
input$Date <- as.Date(input[,"Date"], "%Y-%m-%d")
#Sort based on date, I want to leave out the entries with the oldest dates.
input <- input[ with( input, order(Date)), ]
#Create number of items I want to select
table_input <- as.data.frame(table(input$Product))
table_input$twentyfive <- ceiling( table_input$Freq*0.25 )
#This next part is a very time consuming method (Have 2 mln rows, 90k different products)
first <- TRUE
for( i in table_input$Var1 ) {
data_selected <- input[input$Product == i,]
number <- table_input[table_input$Var1 == i ,]$twentyfive
head <- head( data_selected, number)
if( first == FALSE) {
output <- rbind(output, head)
} else {
output <- head
}
first <- FALSE
}
誰かがより良い、より効率的な方法を知っていることを願っています。ここで答えから分割関数を使用しようとしました: R のデータ フレーム内の列の一意の値ごとに上位の有限数の行を選択して、製品を分割し、それらを反復して head() を選択しようとしました。ただし、分割機能は常にメモリ不足になります(割り当てられません..)
input_split <- split(input, input$Product) #Works here, but not i my problem.
結局のところ、私の問題は、それぞれのユニークな製品の異なる量を選択したいということです. ここでは、1000001 からの 2 つのアイテムと、1000002 および 1000003 からの 1 つのアイテムです。