在R中,如何使用apply
,lapply
,rapply
,do.call
等功能替换以下代码?
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
是的,我只是想学习如何正确使用apply和stuff。
答案 0 :(得分: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
长度1,正如@djhurio指出的那样。
答案 1 :(得分: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
答案 2 :(得分:1)
另一种解决方案,无需匿名功能。 mapply
向量化combn
,而rapply
递归遍历组合列表,使用,
折叠它们。
rapply(mapply(combn, list(u), seq_along(u), simplify = F), paste, collapse = ",")