0

朋友们,我有一个数据框,我想从中选择唯一的三列并将所选列发送到一个自定义函数,该函数将返回一个列向量和一些标量。我想知道是否有办法在 R 中使用简洁的代码来做到这一点。现在让我详细说明。

假设这是我的数据框:

> data
  X1 X2 X3 X4 X5
1  1  5  9 13 17
2  2  6 10 14 18
3  3  7 11 15 19
4  4  8 12 16 20

然后,我创建一个索引以从该数据框中选择所有三个唯一列:

> cols=combn(ncol(mat), 3)
> cols
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    1    1    2    2    2     3
[2,]    2    2    2    3    3    4    3    3    4     4
[3,]    3    4    5    4    5    5    4    5    5     5

并连接名称:

> nams<-apply(combn(colnames(data),3), 2, function(z) paste(z, collapse = ' '))
> nams
 [1] "X1 X2 X3" "X1 X2 X4" "X1 X2 X5" "X1 X3 X4" "X1 X3 X5" "X1 X4 X5" "X2 X3 X4"
 [8] "X2 X3 X5" "X2 X4 X5" "X3 X4 X5"

现在这是我不确定如何进行的部分。如何最好地编写一个自定义函数,该函数对发送给它的三个向量进行操作并返回一个由向量​​和标量组成的对象,例如返回 X1+X2+X3 以及 X1、X2 和 X3 的均值和标准差等标量。

假设以下是函数:

someFunc <- function(subMat){
    someFunc$vector=subMat[,1]+subMat[,2]+subMat[,3] # return vector
    someFunc$mean1=mean(subMat[,1])
    someFunc$sd1=sd(subMat[,1])
    someFunc$mean2=mean(subMat[,2])
    someFunc$sd2=sd(subMat[,2])
    someFunc$mean3=mean(subMat[,3])
    someFunc$sd3=sd(subMat[,3])
    return(someFunc)
}

我想我想弄清楚如何构建 R 中的自定义函数来处理和发送向量+标量,因此将上述函数视为我的粗略尝试。

下一步。在其他帖子之一中@Prasad Chalasani 指出,发送此类函数的正确 R 方法将涉及使用 apply 函数,但我似乎无法将这些部分放在一起。

result <- apply( cols, 2, someFunc ........

如果有任何含糊之处,请告诉我,我会尽我所能进一步澄清问题。总之:我有一个数据框,我想从中将所有唯一的三列发送到一个函数,然后返回多个结果。无法定义这样的函数并使用 apply 向其发送数据。

4

1 回答 1

0

您可以传递一个函数combn,这似乎是您真正想要做的。在这种情况下,您不想简化结果。

Alist似乎是您想要返回的内容

您可以使用setNames在一行中设置结果的名称,使用combnwithpaste给出一个合理的名称

someFunc <- function(dd, .which){
  rr <- list(vec = rowSums(dd[,.which]))
  names(rr) <- paste('sum', paste(.which,collapse = '.'),sep='.')
  means <- lapply(dd[.which],mean)
  sds <- lapply(dd[.which], sd)

  return(c(rr, sd = sds, mean =means))
}
results <- setNames(combn(names(data),3, FUN = someFunc,dd = data, simplify = FALSE), 
                    combn(names(data),3, FUN = paste, collapse=':'))
head(results,2)
# $`X1:X2:X3`
# $`X1:X2:X3`$sum.X1.X2.X3
# 1  2  3  4 
# 15 18 21 24 
# 
# $`X1:X2:X3`$sd.X1
# [1] 1.290994
# 
# $`X1:X2:X3`$sd.X2
# [1] 1.290994
# 
# $`X1:X2:X3`$sd.X3
# [1] 1.290994
# 
# $`X1:X2:X3`$mean.X1
# [1] 2.5
# 
# $`X1:X2:X3`$mean.X2
# [1] 6.5
# 
# $`X1:X2:X3`$mean.X3
# [1] 10.5
# 
# 
# $`X1:X2:X4`
# $`X1:X2:X4`$sum.X1.X2.X4
# 1  2  3  4 
# 19 22 25 28 
# 
# $`X1:X2:X4`$sd.X1
# [1] 1.290994
# 
# $`X1:X2:X4`$sd.X2
# [1] 1.290994
# 
# $`X1:X2:X4`$sd.X4
# [1] 1.290994
# 
# $`X1:X2:X4`$mean.X1
# [1] 2.5
# 
# $`X1:X2:X4`$mean.X2
# [1] 6.5
# 
# $`X1:X2:X4`$mean.X4
# [1] 14.5
于 2013-03-28T02:12:13.063 回答