相关疑难解决方法(0)

我在哪里可以学习如何编写C代码来加速慢速R函数?

学习如何编写用于R的C代码的最佳资源是什么?我知道R扩展的系统和外语接口部分,但我发现它很难.编写用于R的C代码有哪些好的资源(在线和离线)?

为了澄清,我不想学习如何编写C代码,我想学习如何更好地集成R和C.例如,我如何从C整数向量转换为R整数向量(反之亦然)或者从C标量到R向量?

r rcpp

111
推荐指数
4
解决办法
9050
查看次数

生成R中列表的所有不同排列

我正在尝试创建列表的排列列表,例如perms(list("a", "b", "c"))返回

list(list("a", "b", "c"), list("a", "c", "b"), list("b", "a", "c"),
     list("b", "c", "a"), list("c", "a", "b"), list("c", "b", "a"))
Run Code Online (Sandbox Code Playgroud)

我不知道如何继续,任何帮助将不胜感激.

r permutation

51
推荐指数
8
解决办法
7万
查看次数

置换R中向量的所有唯一枚举

我试图找到一个函数来置换向量的所有唯一排列,同时不计算相同元素类型的子集内的并置.例如:

dat <- c(1,0,3,4,1,0,0,3,0,4)
Run Code Online (Sandbox Code Playgroud)

具有

factorial(10)
> 3628800
Run Code Online (Sandbox Code Playgroud)

可能的排列,但仅限于 10!/(2!*2!*4!*2!)

factorial(10)/(factorial(2)*factorial(2)*factorial(2)*factorial(4))
> 18900
Run Code Online (Sandbox Code Playgroud)

忽略同一元素类型的子集内的并置时的唯一排列.

我可以通过使用unique()permn()包中的函数来获得这个combinat

unique( permn(dat) )
Run Code Online (Sandbox Code Playgroud)

但这在计算上非常昂贵,因为它涉及枚举n!,这可能比我需要的排列多一个数量级.没有先计算,有没有办法做到这一点n!

algorithm r permutation combinatorics

18
推荐指数
1
解决办法
4328
查看次数

生成M个箱中N个球的所有排列

我想nm箱子中生成一组球的排列.以下嵌套列表集生成这些排列.

n <- 3
m <- 4
v <- rep(0,m)
for (i in n:0){
  for (j in (n-sum(i)):0){
    for (k in (n-sum(i,j)):0){
      for (l in (n - sum(i,j,k)):0){
        v <- c(i,j,k,l)
        print(v)
        if (sum(v) == n){ break }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

打印解决方案:

[1] 3 0 0 0
[1] 2 1 0 0
[1] 2 0 1 0
[1] 2 0 0 1
[1] 1 2 0 0
[1] 1 1 1 0
[1] 1 1 …
Run Code Online (Sandbox Code Playgroud)

r permutation

9
推荐指数
1
解决办法
812
查看次数

R中具有重复项的数据集的排列

我正在使用R来生成在其中复制的向量的排列.

在生成排列时,我使用数字来表示组.这是我能为小家伙做的事情:

unlist(unique(permn(c(1,1,2,2,3,3,4,4), paste0, collapse = "")))
Run Code Online (Sandbox Code Playgroud)

返回2520个排列的矢量(8!/ 2 ^ 4)

问题是我正在尝试将其向上滚动到11,以便我可以获得16选11的每个独特排列.为了得到我所做的每一个组合:

combs = unique(combn(c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4),11, paste0, collapse = ""))
Run Code Online (Sandbox Code Playgroud)

然后迭代它们并将它们粘贴在一起以获得所有独特的16种选择11种排列.

听起来像一个巨大的数字?

事实并非如此.理论上它是525,525行(16!/ 5!4!4!4!4!)问题是这种方法必须以3900万(11!)的组计算所有174356582400行(大约为1740亿行)并执行独特的操作.

在找到排列时,是否有一种方法可以在重复中使用快捷方式和因子?

看看其他方法,我发现这可行:

unique(permutations(16,11, c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), set=FALSE))
Run Code Online (Sandbox Code Playgroud)

除了它花了太多时间做这件事,而且我正在做同样的事情,我正在做的是找到所有坏的,然后将它们排除在外

r permutation

6
推荐指数
1
解决办法
267
查看次数

为所有可能的组合实现过滤的更快方法

考虑我有一个这样的数据框,

set.seed(1)

q<-100

df <- data.frame(Var1 = round(runif(q,1,50)),
                    Var2 = round(runif(q,1,50)),
                        Var3 = round(runif(q,1,50)),
                            Var4 = round(runif(q,1,50)))
attach(df)
Run Code Online (Sandbox Code Playgroud)

如您所知,q代表设置数据帧中每列的长度。

我想对列的所有可能组合进行过滤。可以是任何东西。假设我正在寻找前两列之和与后两列之和的除法是否大于1。

使用expand.grid()功能可以实现这一目标。

a <- Sys.time()

expanded <- expand.grid(Var1, Var2, Var3, Var4)

Sys.time() - a

Time difference of 8.31997 secs


expanded  <- expanded[rowSums(expanded[,1:2])/ rowSums(expanded[,3:4])>1,]
Run Code Online (Sandbox Code Playgroud)

但是,这需要很多时间!为了使速度更快,我尝试rep.int()这个问题中使用函数来回答问题,并设计了自己的函数。

myexpand <- function(...) {

 sapply(list(...),function(y) rep.int(y, prod(lengths(list(...)))/length(y)))

}
Run Code Online (Sandbox Code Playgroud)

但这不是那么有希望。与我的期望和expand.grid他人的期望相比,它花费了更多的时间。而且,如果我设定更大q的期望值,那将成为一个难题!

在应用expand.grid或之前,是否有适当的方法可以通过矩阵运算更快(1-2秒)来实现这一目标myexpand。而且,我想知道使用R这样的解释语言是否有缺点。软件建议也可以接受。

combinations r

5
推荐指数
1
解决办法
168
查看次数

R找到所有可能的唯一组合

我试图在 R 中找到所有可能的独特组合。似乎有很多类似的问题被问到,但我找不到相同的问题。

我的问题是从向量 x 中找到 m 个元素的组合,但 m 可能大于 x。例如,从字母 [1:2] 中选取 3 个元素,希望可以返回:

combn(letters[1:2],3)
       [,1]  [,2]  [,3]  [,4] 
[1,]   "a"   "a"   "a"    "b"
[2,]   "a"   "a"   "b"    "b"
[3,]   "a"   "b"   "b"    "b"
Run Code Online (Sandbox Code Playgroud)

但是组合函数 n < m 中的错误。有类似的功能,包括 gtools:permutations、expand.grid。

如果之前有人问过同样的问题,但我没有听懂,再次道歉。谢谢。

combinations r combn

4
推荐指数
1
解决办法
6501
查看次数

R:如何获得 2 个向量的唯一成对组合

x = 1:3
y = 1:3
> expand.grid(x = 1:3, y = 1:3)
  x y
1 1 1
2 2 1
3 3 1
4 1 2
5 2 2
6 3 2
7 1 3
8 2 3
9 3 3
Run Code Online (Sandbox Code Playgroud)

使用expand.grid给了我所有的组合。但是,我只想要成对比较,也就是说,我不想要 1 对 1、2 对、2 或 3 对 3 的比较。此外,我只想保留唯一的对,即我想保留1 对 2(而不是 2 对 1)。

总之,对于上述xy,我想要以下 3 对组合:

  x y
1 1 2
2 1 3
3 2 3
Run Code Online (Sandbox Code Playgroud)

同样,对于x = …

combinations r pairwise

2
推荐指数
1
解决办法
61
查看次数