2012-09-18 30 views
4

這是一個簡單的答案。我想爲測試目的而將數據分組。我有一個數據框,我想保留所有信息欄,只需簡單地減少每個人的觀察次數。所以,我有一個獨特的標識符和大約50個人。我想只選擇2個人並且我只想從那些中選擇500個數據點。子集首先按組分組500行,對於子組

我的數據幀被稱爲wloc08。有50個唯一的ID。我只需要那些人中的2個,但這兩個人中只有500個數據點。

subwloc08=subset(wloc08, subset = ID %in% c("F07001","F07005")) 

在本聲明中的某處可以使用[

reduced= subwloc08$ID[1:500,] 

不起作用。

回答

3

你可以使用lapply

do.call("rbind", 
     lapply(c("F07001", "F07005"), 
       function(x) wloc08[which(wloc08$ID == x)[1:500], ])) 

你的命令reduced = subwloc08$ID[1:500,]沒有工作,因爲subwloc08$ID是一個載體。但是,reduced = subwloc08$ID[1:500]本可以工作,但會返回subwloc08$ID的前500個值(而不是整行subwloc08)。

如果你想運行此命令的第30名,你可以使用unique(wloc08$ID)[1:30]代替c("F07001", "F07005")

do.call("rbind", 
     lapply(unique(wloc08$ID)[1:30], 
       function(x) wloc08[which(wloc08$ID == x)[1:500], ])) 
+0

謝謝!有什麼辦法讓這個更一般嗎?那麼,可以說我不想僅指定2個人,而是30個,並從每個人中挑選一個子集?我需要輸入全部30個名字嗎?或者我可以做一些像lapply(wloc08 [wloc08 $ ID [1:30]]),函數(x)..... – Kerry

+1

如果要爲前30個主題運行此命令,可以使用'unique(wloc08 $ ID)[1:30]'而不是'c(「F07001」,「F07005」)'。 –

+0

酷!我刪除了我以前的評論,以避免未來的混淆。 – BenBarnes

6

如果你只處理2種人,你可以用單獨子集劃分每個脫身然後rbind荷蘭國際集團各子集:

wloc08F07001 <- wloc08[which(wloc08$ID == "F07001")[1:500], ] 

wloc08F07005 <- wloc08[which(wloc08$ID == "F07005")[1:500], ] 

reduced <- rbind(wloc08F07001, wloc08F07005) 

爲了使這更加普及,特別是如果你正在處理大量的數據,你可以考慮看data.table帕茨卡GE。下面是一個例子

library(data.table) 

wloc08DT<-as.data.table(wloc08) # Create data.table 

setkey(wloc08DT, "ID")   # Set a key to subset on 

# EDIT: A comment from Matthew Dowle pointed out that by = "ID" isn't necessary 
# reduced <- wloc08DT[c("F07001", "F07005"), .SD[1:500], by = "ID"] 
reduced <- wloc08DT[c("F07001", "F07005"), .SD[1:500]] 

要打破的最後一步的語法:

  1. c("F07001", "F07005"):這將找到的所有行關鍵是等於F07001F07005子集數據。它還將鼓動「通過而不會被」(見?data.table的詳細信息)

  2. .SD[1:500]:500:這將通過選擇行1子集中的.SD對象(子集data.table)。

  3. 編輯由於Matthew Dowle的更正,此部分被刪除。前面是:(by = "ID":這告訴[.data.table對每個ID分別執行步驟2中的操作,在這種情況下,僅顯示步驟1中指示的ID。)

+0

@Kerry,如需更普遍的解決方案,請參閱上面的修改。 – BenBarnes

+0

這非常有趣。我會更多地關注data.tables。我從未遇到過他們。我經常遇到需要在多個人身上執行多個命令的情況。 – Kerry

+2

@BenBarnes嗨。所有正確的w.r.t. '.SD'等,不需要'by =「ID」'。無論如何,'j'爲'i'中的每個組運行。這對利用效率非常重要。它被稱爲_by-without-by_,或_grouping-by-i_。通過包含'by =「ID」'使它像複合查詢一樣工作:'wloc08DT [c(「F07001」,「F07005」)] [,.SD [1:500],by =「ID」]'在這種情況下,'i'無論如何都加入'ID'。 –