0

友人、3 つの一意の列を選択し、選択した列を列ベクトルといくつかのスカラーを返すカスタム関数に送信するデータ フレームがあります。これを行うために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

次に、このデータ フレームから 3 つの一意の列をすべて選択するインデックスを作成します。

> 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"

今、これは私がどのように進むべきかわからない部分です. 送信された 3 つのベクトルで動作し、ベクトルとスカラーで構成されるオブジェクトを返すカスタム関数を最適に記述する方法。たとえば、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 のカスタム関数を構築する方法を理解しようとしていると思います。したがって、上記の関数を大まかな試みと考えてください。

次のステップ。他の投稿の 1 つで、@Prasad Chalasani は、ベクトルがそのような関数を送信する適切な R の方法には、apply 関数の使用が含まれると指摘しましたが、私はそれらをまとめることができないようです。

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

不明な点がある場合はお知らせください。問題をさらに明確にするために最善を尽くします。要約すると、データフレームがあり、そこから3つの一意の列をすべて関数に送信し、複数の結果を返します。そのような関数を定義し、適用を使用してデータを送信するのに問題があります。

4

1 に答える 1

0

関数combnを渡すことができ、これが本当にやりたいことのようです。この場合、結果を単純化したくありません。

Alistはあなたが返したいもののように見えます

を使用setNamesして結果の名前を 1 行で設定し、with を使用combnpasteて妥当な名前を付けることができます。

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 に答える