2011-05-10 54 views
5

如何選擇列值的隨機樣本的所有行?R - 選擇行值作爲列值的隨機樣本?

我有一個數據幀,看起來像這樣:

tag weight 

R007  10 
R007  11 
R007  9 
J102  11 
J102  9 
J102  13 
J102  10 
M942  3 
M054  9 
M054  12 
V671  12 
V671  13 
V671  9 
V671  12 
Z990  10 
Z990  11 

,你可以使用複製...

weights_df <- structure(list(tag = structure(c(4L, 4L, 4L, 1L, 1L, 1L, 1L, 
3L, 2L, 2L, 5L, 5L, 5L, 5L, 6L, 6L), .Label = c("J102", "M054", 
"M942", "R007", "V671", "Z990"), class = "factor"), value = c(10L, 
11L, 9L, 11L, 9L, 13L, 10L, 3L, 9L, 12L, 12L, 14L, 5L, 12L, 11L, 
15L)), .Names = c("tag", "value"), class = "data.frame", row.names = c(NA, 
-16L)) 

我需要創建一個包含所有行從上面的數據幀一兩個隨機採樣標籤的數據幀。假設標籤R007和M942隨機選中,我的新數據幀需要如下所示:

tag weight 

R007  10 
R007  11 
R007  9 
M942  3 

我該怎麼做?

我知道我可以創建這樣兩個隨機變量的列表:

library(plyr) 
tags <- ddply(weights_df, .(tag), summarise, count = length(tag)) 
set.seed(5464) 
tag_sample <- tags[sample(nrow(tags),2),] 
tag_sample 

在...

tag count 
4 R007  3 
3 M942  1 

得到的,但我只是不知道如何用它來子集我的原始數據幀。

回答

7

這是你想要的嗎?

subset(weights_df, tag%in%sample(levels(tag),2)) 
+0

你明白了:)謝謝!我實際上試圖找到一個類似於SQL的「in」運算符,但沒有提出任何問題。 – 2011-05-10 02:13:04

+0

不錯的一個。儘管我不認爲你需要調用'levels'函數。 – Ramnath 2011-05-10 02:24:20

+0

@Ramnath這裏'levels'是必要的。 – kohske 2011-05-10 02:32:52

2

如果您data.frame名爲dfrm,那麼這將選擇100個隨機tag小號

dfrm[ sample(NROW(dfrm), 100), "tag" ] # possibly with repeats 

如果,另一方面,你想用相同的列(可能有重複)一個數據幀:

samp <- dfrm[ sample(NROW(dfrm), 100), ] # leave the col name entry blank to get all 

第三種可能性......你想100個不同的標籤隨意,但不是在所有加權的頻率概率:

samp.tags <- unique(dfrm$tag)[ sample(length(unique(dfrm$tag)), 100] 

修改:修改問題;其中之一:

subset(dfrm, tag %in% c("R007", "M942")) 

或者:

dfrm[dfrm$tag %in% c("R007", "M942"), ] 

或者:

dfrm[grep("R007|M942", dfrm$tag), ] 
+0

對不起隊友,我不確定我原來的問題很清楚,所以我不相信你的答案適用於我正在嘗試做的事情。更新的問題是否更有意義? – 2011-05-10 01:22:24

+0

這將是微不足道的使用任何子集或「[」與'%在%' – 2011-05-10 02:32:59