在R中执行分类变量的置换
我拥有的数据集类似于这样在R中执行分类变量的置换,r,R,我拥有的数据集类似于这样 dd = data.frame(X = factor(c("p","p","p","p","s","s","s"), levels = c("p","s")), Y = factor(c("ns&
dd = data.frame(X = factor(c("p","p","p","p","s","s","s"),
levels = c("p","s")),
Y = factor(c("ns","ns","ss","ss","ss","vs","vs"),
levels = c("ns","ss","vs"))
)
我需要修正Y和置换X。
总排列为7C3=35。我尝试使用函数:sample,但我唯一能做的就是将样本运行10000次并获取唯一向量
有更好的方法吗?上述方法仅在总置换数较少时有效
有人能帮我弄清楚吗 这是我用来创建35个向量的代码
get_perm <- function(x){
#This will work up to n = 6
n = length(x)
nperm = 10000
all_samp = matrix(NA, nrow = nperm, ncol = n)
for(i in 1:nperm){
set.seed(i)
all_samp[i,] = sample(x)
}
return(unique(all_samp))
}
X_perm = get_perm(dd$X)
get_perm您的意思是使用包gtools
+unique
library(gtools)
with(
dd,
unique(permutations(length(X), length(X), as.integer(X), set = FALSE))
)
给
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 2 2 2 1 1 1 1
[2,] 2 2 1 2 1 1 1
[3,] 2 2 1 1 2 1 1
[4,] 2 2 1 1 1 2 1
[5,] 2 2 1 1 1 1 2
[6,] 2 1 2 2 1 1 1
[7,] 2 1 2 1 2 1 1
[8,] 2 1 2 1 1 2 1
[9,] 2 1 2 1 1 1 2
[10,] 2 1 1 2 2 1 1
[11,] 2 1 1 2 1 2 1
[12,] 2 1 1 2 1 1 2
[13,] 2 1 1 1 2 2 1
[14,] 2 1 1 1 2 1 2
[15,] 2 1 1 1 1 2 2
[16,] 1 2 2 2 1 1 1
[17,] 1 2 2 1 2 1 1
[18,] 1 2 2 1 1 2 1
[19,] 1 2 2 1 1 1 2
[20,] 1 2 1 2 2 1 1
[21,] 1 2 1 2 1 2 1
[22,] 1 2 1 2 1 1 2
[23,] 1 2 1 1 2 2 1
[24,] 1 2 1 1 2 1 2
[25,] 1 2 1 1 1 2 2
[26,] 1 1 2 2 2 1 1
[27,] 1 1 2 2 1 2 1
[28,] 1 1 2 2 1 1 2
[29,] 1 1 2 1 2 2 1
[30,] 1 1 2 1 2 1 2
[31,] 1 1 2 1 1 2 2
[32,] 1 1 1 2 2 2 1
[33,] 1 1 1 2 2 1 2
[34,] 1 1 1 2 1 2 2
[35,] 1 1 1 1 2 2 2
您想要combn(dd$X,3)
?您能举一个您想要的结果的例子吗?也许可以缩小到5C2,通过10种组合,您可以显示您想要生成的确切结果,我们可以帮助提供可放大到实际数据的代码?我添加了用于创建向量的代码。请在你的系统上运行它,我想要一个类似的输出,但使用更好的方式。你能解释一下吗this@animus您有三个2
s(对应于s
作为dd$X
中的一个因子),它们将随机分布在7个位置中。这意味着您需要从7个位置中枚举这三个2
s的所有组合combn
生成2
s的位置,然后替换1
s的初始化数组中的索引(通过rep(1,长度(X))
)到达该位置。如果有三个或更多级别,这是否可行?@animus否,这不适用于两个以上级别,但是你可以按照类似的想法修改代码,我似乎不明白。我尝试过“replace(replace(rep(1,length(dd$X)),v[1:2],2),v[3],3)”,但它仍然只生成35,因为我在combn中指定了3。如果向量是c(1,1,1,2,2,3),那么我们有140个置换。