学习如何编写用于R的C代码的最佳资源是什么?我知道R扩展的系统和外语接口部分,但我发现它很难.编写用于R的C代码有哪些好的资源(在线和离线)?
为了澄清,我不想学习如何编写C代码,我想学习如何更好地集成R和C.例如,我如何从C整数向量转换为R整数向量(反之亦然)或者从C标量到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)
我不知道如何继续,任何帮助将不胜感激.
我试图找到一个函数来置换向量的所有唯一排列,同时不计算相同元素类型的子集内的并置.例如:
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!?
我想n在m箱子中生成一组球的排列.以下嵌套列表集生成这些排列.
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来生成在其中复制的向量的排列.
在生成排列时,我使用数字来表示组.这是我能为小家伙做的事情:
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)
除了它花了太多时间做这件事,而且我正在做同样的事情,我正在做的是找到所有坏的,然后将它们排除在外
考虑我有一个这样的数据框,
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这样的解释语言是否有缺点。软件建议也可以接受。
我试图在 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。
如果之前有人问过同样的问题,但我没有听懂,再次道歉。谢谢。
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)。
总之,对于上述x和y,我想要以下 3 对组合:
x y
1 1 2
2 1 3
3 2 3
Run Code Online (Sandbox Code Playgroud)
同样,对于x = …