我正在写一个排列函数
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在我的情况下):
我尝试取出表并可以使用subset()和cbind()强制组合两列,但我不知道如何在函数内写入它。
答案 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