如何在函数内按变量重新排列表?

时间:2016-03-01 01:31:02

标签: r

我正在写一个排列函数

  permutation<-function(seed,treatment,block_number,block_sizes,sample.size){
  b<-block_number
  s<-block_sizes  ## number of subjects per block
  set.seed(seed)
  m<-sample(s,size=b,replace = T) ## how the block is assigned
  treats<-vector("list",b)
  for (i in 1:b){
    treats[[i]]<-sample(rep(treatment,each=m[i]))## permutation within each block
  }
  assign<-unlist(treats)[1:sample.size]
  table<-data.frame(cbind(as.numeric(c(1:sample.size)),assign))
  return(table)
}

permutation(seed=1,treatment=c('a',"b"),block_number=4,block_sizes=c(2,3),sample.size = 15)

我的输出是这样的数据框:

   V1 assign
1   1      a
2   2      b
3   3      a
4   4      b
5   5      b
6   6      a
7   7      b
8   8      a
9   9      b
10 10      a
11 11      b
12 12      b
13 13      a
14 14      a
15 15      a

我想要的是通过treament重新排列输出表,格式如下(图片中的1,2,3应该是a,b在我的情况下):

enter image description here

我尝试取出表并可以使用subset()和cbind()强制组合两列,但我不知道如何在函数内写入它。

1 个答案:

答案 0 :(得分:1)

我不确定将不同长度的矢量放在表格中是否是一个好习惯。相反,您可以使用每个处理一个元素的列表。

但是,您可以修改函数以使用布尔参数处理这两种情况。我使用库plyr作为l*ply - 就像函数一样,因为我发现它们对于处理输入和输出类型非常有用。我使用plyr::显式调用函数。当然,您可以使用lapply并根据需要转换为矢量,列表或表格。

permutation<-function(seed,treatment,block_number,block_sizes,sample.size, table = FALSE){
  b<-block_number
  s<-block_sizes  ## number of subjects per block
  set.seed(seed)
  m<-sample(s,size=b,replace = T) ## how the block is assigned
  treats<-vector("list",b)
  for (i in 1:b){
    treats[[i]]<-sample(rep(treatment,each=m[i]))## permutation within each block
  }
  assign<-unlist(treats)[1:sample.size]

  lres <- setNames(plyr::llply(treatment, function(treat) which(assign == treat)), treatment)

  if(table){
    nrow <- max(plyr::laply(lres, length))
    DF <- plyr::llply(lres, function(x) {
      vec <-vector("character", nrow)
      vec[1:length(x)] <- x
      vec
    })
    return(as.data.frame(DF))
  }
  lres
}

然后使用参数table = TRUE,您可以获得所需的表格(""

library(plyr)
permutation(seed=1, treatment=c('a',"b"), block_number=4, block_sizes=c(2,3), sample.size = 15, table = TRUE)
#>    a  b
#> 1  1  2
#> 2  3  4
#> 3  6  5
#> 4  8  7
#> 5 10  9
#> 6 13 11
#> 7 14 12
#> 8 15

然而,在不同长度元素的情况下使用列表似乎更好。 (table = FALSE

library(plyr)
permutation(seed=1, treatment=c('a',"b"), block_number=4, block_sizes=c(2,3), sample.size = 15, table = FALSE)
#> $a
#> [1]  1  3  6  8 10 13 14 15
#> 
#> $b
#> [1]  2  4  5  7  9 11 12