2014-02-14 42 views
-1

我想根據元數據中的兩個條件製作我的數據的子集。基於元數據表從data.frame/data.table子集的快速方法

data= data.frame (w=c(rep ("a", 10),rep("b", 10), rep ("c", 10)), y=(rep(c(1,2,3),10)), v=rnorm (30)) 
metadata = data.frame (w=c("b","a",),y= c(1,2)) 

allY <- data.frame() 
mainY <- data.frame() 

for (x in 1:length (data [,1])){ 
allY <- data.frame (data [which (data$w %in% metadata[x,1]),]) 
mainY <- data.frame (rbind (mainY, allY [which (allY$y %in% metadata[x,2]),])) 
} 
mainY 

問題是數據和元數據都很大,而且這樣做一直需要數小時。當它完成時,我有一個錯誤:

你知道我該怎麼種子的過程,也許使用data.table?

非常感謝!

+0

您發佈的代碼沒有做任何事情('mainY'在最後是空的),使得很難弄清楚你在做什麼。選擇'metadata [x,2]'幾乎肯定不會做你想要的:'x'正在從一個因子轉換爲數字。如果它不是一個因素,那麼它會使用rownames,其中你沒有。 – nograpes

+1

請描述你想要達到的效果並顯示預期的輸出。 – Roland

+0

謝謝你。我已經使用了元數據[,1]而不是元數據[x,1],並排除了for循環,現在我的問題已解決。這很快就做到了。 – AEM

回答

0

這是很難說......但我懷疑你想要可以簡單地做了什麼:

merge(data,metadata) 

哪個不是R中準確快速,但比for循環更好。如果事先轉換爲data.table,並設置密鑰,則可以像這樣運行merge,它將工作得非常快。

+0

我已經改變了代碼,我想現在你可以明白我的意思了......我不認爲合併將解決我的問題,因爲我想有一個完全類似於'data'的表,並且'data'中的信息和'元數據「完全不同。非常感謝 – AEM