作者gsuper (統計的巴比倫塔)
看板Statistics
標題[程式] 排列組合的加法
時間Mon Dec 20 01:20:17 2010
我需要算的原始資料如下
x <- c(1,2,4)
然後要能夠算出所有排列組合的加法
result
---------------
1=1
2=2
4=4
3=1+2
5=1+4
6=2+4
7=1+2+4
---------------
請問有沒有現成的 function 可以用?
如果沒有的話
這種東西大概要怎麼寫阿?
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.239.247
※ 編輯: gsuper 來自: 140.113.239.247 (12/20 01:20)
自問自答 again
x <- c(1,2,4)
i=1
S_list<-NULL
for(i in 1:length(x))
{ S_list[[i]] <-
combn(x,m=i) }
※ 編輯: gsuper 來自: 140.113.239.247 (12/20 16:08)
※ 編輯: gsuper 來自: 140.113.239.247 (12/20 16:08)
1F:→ andrew43:厲害 12/20 18:27
2F:→ bmka:可以用sapply避免寫loop 12/20 20:34
寫了一個遞迴版本
看起來跟迴圈一樣慢
終端機螢幕都要閃12下 (12秒)
不知道還有沒有辦法寫的更快
#################################
x <- 1:20
a=NULL
i=length(x)
fx <- function(tmp)
{
a[[i]] <<- combn(tmp,m=i)
i <<- i-1
if(i!=0){fx(tmp)}
}
fx(x)
※ 編輯: gsuper 來自: 140.113.239.247 (12/21 01:24)
※ 編輯: gsuper 來自: 140.113.56.120 (12/21 02:40)
※ 編輯: gsuper 來自: 140.113.56.120 (12/21 03:09)
## apply 版本也是12秒
x <- 1:20
i = matrix(1:length(x),length(x),1)
fx <- function(I)
{combn(x,m=I)}
a <- apply(i,1,fx)
※ 編輯: gsuper 來自: 140.113.239.247 (12/21 20:45)
※ 編輯: gsuper 來自: 140.113.239.247 (12/21 20:45)
3F:→ bmka:sapply(1:20, combn, x=1:20) should yield the same result 12/21 21:43
測試完還是12秒
我想是 combn() 的速度上限影響的吧
P.S. 這個寫法很酷
4F:→ lin15:apply系列似乎不會比較快喔~ 12/21 21:48
※ 編輯: gsuper 來自: 140.113.239.247 (12/21 21:58)
※ 編輯: gsuper 來自: 140.113.239.247 (12/21 22:23)
※ 編輯: gsuper 來自: 140.113.239.247 (12/21 22:37)
又當筆記用了...
這是整理成 index 的做法
F <- 14
data <- sapply(1:F, combn, x=1:F)
fx<-function(M)
{ if(dim(M)[1]!=F)
M <- rbind(M,matrix(0,F-dim(M)[1],dim(M)[2]))
}
data <- sapply(data,fx)
DATA <- NULL
for(g in 1:F)
{ DATA <- cbind(DATA,data[[g]]) }
※ 編輯: gsuper 來自: 140.113.239.247 (06/08 14:44)
##########################################################
require(combinat)
permn(3)
combn(3, 2)
※ 編輯: gsuper (114.32.215.136), 07/29/2014 16:49:16