Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中执行分类变量的置换_R - Fatal编程技术网

在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个置换。