2011-11-15 53 views
3

在R中,如何使用apply,lapply,rapply,do.call等功能替換下面的代碼?轉換for循環申請

u <- 10:12 
slist <- list() 

for (i in 1:length(u)) { 
    p <- combn(u, i) 
    for (j in 1:ncol(p)) { 
    s <- paste(p[,j], collapse=",") 
    slist[[s]] <- 0 
    } 
} 


對於此部分:

for (j in 1:ncol(p)) { 
    s <- paste(p[,j], collapse=",") 

我想是這樣的:

s <- apply(p, 2, function(x) paste(x, collapse=",")) 

其中一期工程。但是對於那個相同的for循環中的那個slist[[s]] <- 0部分,我不知道該怎麼做。

編輯:這就是我想要做的。對於矢量u,我正在生成該矢量中所有子集的列表。然後,對於每個子集,我將它分配到s,然後使用字符串s作爲slist中元素的名稱。有點奇怪,我知道,但這是爲了做家庭作業。對於上面的代碼,這將是SLIST的第5個元素:

> slist 
$`10` 
[1] 0 

$`11` 
[1] 0 

$`12` 
[1] 0 

$`10,11` 
[1] 0 

$`10,12` 
[1] 0 

是的,我只是想學習如何使用應用和東西正常。

+0

你的for循環會產生一個不尋常的列表。也許你想解釋你真的想要做什麼? – Andrie

+0

好的,完成了!我編輯了原文。 – Crystal

回答

4

這裏有一個解決方案:

n <- unlist(lapply(seq_along(u), function(i) { 
    apply(combn(length(u),i),2, function(x) paste(u[x], collapse=',')) 
} 
)) 

slist <- list() 
slist[n] <- 0 

UPDATE發佈在同一時間@djhurio,這是非常相似的,但我還是把改變使用combn因此處理u的自由@djhurio指出,長度爲1。

+0

+1的更短的解決方案 – djhurio

+3

我可以得到任何代表增加使用*應用程序的一個? 'indvec < - unlist(lapply(sapply(1:3,combn,x = u),function(z)apply(z,2,paste,collapse =「,」)))' –

+1

呃,你有個評論upvote從我 - 然後抱怨評論upvotes應該給予rep點的stackoverflow維護者;-) – Tommy

3

使用一個apply和一個lapply的解決方案。如果length(u)==1也有效。

# Define function to create combinations 
f1 <- function(y, i) { 
    if (length(y)==1) as.character(y) else { 
    p <- combn(y, i) 
    apply(p, 2, function(x) paste(x, collapse=",")) 
    } 
} 

# Initial vector 
u <- 10:12 

# Character vector with all posible combinations 
l <- unlist(lapply(1:length(u), f1, y=u)) 
l 

# Create list with 0 values and same length as l 
slist <- as.list(rep(0, length(l))) 

# Assign names to the list objects 
names(slist) <- l 

slist 
+1

+1 - 偉大的頭腦們都認爲一樣:) – Tommy

1

另一種解決方案,不需要匿名功能。 mapply矢量化combn,而rapply遞歸遍歷組合列表,使用,摺疊它們。

rapply(mapply(combn, list(u), seq_along(u), simplify = F), paste, collapse = ",")