2011-11-15 72 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 = ",")