2016-03-14 76 views
0

说我有一个数据帧如下:如何随机选择只有一行每组

df <- data.frame(Region = c("A","A","A","B","B","C","D","D","D","D"), 
          Combo = c(1,2,3,1,2,1,1,2,3,4)) 
> df 
    Region Combo 
1  A  1 
2  A  2 
3  A  3 
4  B  1 
5  B  2 
6  C  1 
7  D  1 
8  D  2 
9  D  3 
10  D  4 

我想这样做,是为每个区域(A,B,C,d)随机选择只有一个该地区的可能组合。

如果选择的组合是由一个二元变量表示,它会看起来可能是这样的:

Region Combo RandomlyChosen 
1  A  1    1 
2  A  2    0 
3  A  3    0 
4  B  1    0 
5  B  2    1 
6  C  1    1 
7  D  1    0 
8  D  2    0 
9  D  3    1 
10  D  4    0 

我知道样品的功能,但就是不知道该如何选择只有一个组合在每个地区。

我正在使用data.table,所以使用它的任何解决方案都是受欢迎的。虽然不使用data.table的解决方案同样受欢迎。

谢谢!

+0

'DF [,兰德单个行数:= .I == sample(as.character(.I),1),by = Region]'也许是一个data.table解决方案。虽然我怀疑可能有更好的做法, – thelatemail

+0

使用base R:'sapply(split(df $ Combo,df $ Region),function(z)z [sample(1:length(z),1)])' – Raad

+0

@NBATrends返回指定的数字,而不是数据框。为此,你需要像'do.call(rbind,lapply(split(df,df $ Region),function(x){x [sample(seq_along(x $ Combo),1),]}))''' – alistaire

回答

1

在平原R您可以使用sample()tapply()

df$Chosen <- 0 
df[-tapply(-seq_along(df$Region),df$Region, sample, size=1),]$Chosen <- 1 
df 
    Region Combo Chosen 
1  A  1  0 
2  A  2  1 
3  A  3  0 
4  B  1  1 
5  B  2  0 
6  C  1  1 
7  D  1  0 
8  D  2  0 
9  D  3  1 
10  D  4  0 

注意-(-selected_row_number)特技避免采样从1到n时,有一组