2

置換してデータからサブセットをサンプリングしようとしています。ここでは、次のような簡単な例を示します。

dat <- data.frame (
  group = c(1,1,2,2,2,3,3,4,4,4,4,5,5), 
  var = c(0.1,0.0,0.3,0.4,0.8,0.5,0.2,0.3,0.7,0.9,0.2,0.4,0.6)
) 

グループ番号に基づいてサブセットをサンプリングしたいだけです。グループ(たとえば、group = 1)を選択すると、グループ全体(上記の簡単な例では2つのグループメンバー)が選択されます。グループが複数回選択された場合、グループ番号は新しいグループとして変更されます(例:1.1、1.1、1.2、1.2、…)。新しいデータは次のようになります。

newdat <- data.frame (
  group = c(3,3,5,5,3.1,3.1,1,1,3.2,3.2,5.1,5.1,3.3,3.3,2,2,2), 
  var = c(0.5,0.2,0.4,0.6,0.5,0.2,0.1,0.0,0.5,0.2,0.4,0.6,0.5,0.2,0.3,0.4,0.8)
) 

どんな助けでも大歓迎です。

4

2 に答える 2

3

make.unique()これは、次のグループの名前を作成するために使用する非常に単純なソリューションですnewdat

## Your data
dat <- data.frame (
  group = c(1,1,2,2,2,3,3,4,4,4,4,5,5), 
  var = c(0.1,0.0,0.3,0.4,0.8,0.5,0.2,0.3,0.7,0.9,0.2,0.4,0.6)
) 
n <- c(3,5,3,1,3,2,5,3,2)

## Make a 'look-up' data frame that associates sampled groups with new names,
## then use merge to create `newdat`
df <- data.frame(group = n, 
                 newgroup = as.numeric(make.unique(as.character(n))))
newdat <- merge(df, dat)[-1]
names(newdat)[1] <- "group"
于 2012-06-14T16:20:58.780 に答える
2

n好きなように選んでください:

n <- 5 

次に、これを実行します(またはそれから関数を作成します):

lvls <- unique(dat$group)
gp.orig <- gp.samp <- sample( lvls, n, replace=TRUE ) #this is the actual sampling
library(taRifx)
res <- stack.list(lapply( gp.samp, function(i) dat[dat$group==i,] ))
# Now make your pretty group names
while(any(duplicated(gp.samp))) {
  gp.samp[duplicated(gp.samp)] <- gp.samp[duplicated(gp.samp)] + .1
}
# Replace group with pretty group names (a simple merge doesn't work here because the groups are not unique)
gp.df <- as.data.frame(table(dat$group))
names(gp.df) <- c("group","n")
gp.samp.df <- merge(data.frame(group=gp.orig,pretty=gp.samp,order=seq(length(gp.orig))), gp.df )
gp.samp.df <- sort(gp.samp.df, f=~order)
res$pretty <- with( gp.samp.df, rep(pretty,n))

   group var pretty
6      3 0.5    3.0
7      3 0.2    3.0
12     5 0.4    5.0
13     5 0.6    5.0
61     3 0.5    3.1
71     3 0.2    3.1
62     3 0.5    3.2
72     3 0.2    3.2
3      2 0.3    2.0
4      2 0.4    2.0
5      2 0.8    2.0

かなり一般的である必要があります。10を超えるグループが必要な場合は、テキストベースの方法を使用して「きれいな」バージョンを計算する必要があります。これは、数値ベースであるため、これが折り返されるためです。3+10*.1=4たとえば、11番目のグループ3は!として計算されます。

于 2012-06-14T15:22:46.093 に答える