3

問題を示す合成データセットを提供することから始めさせてください:

Do <- rep(c(0,2,4,6,8,10,15,20,30,40,45,50,55,60,65,70,80,85,90,92,94,96,98,100), each=16,times=16)
Cl <- rep(c("K", "Y","M","C"), each= 384, times=4)
In <- rep(c("A", "S"), each=3072)
Sa <- rep(c(1,2), each=1536)
Data <- rnorm(6144)
DataFrame <- cbind.data.frame(Do,Cl,In,Sa,Data); head(DataFrame)
rm(Do,Cl,In,Sa,Data)
attach(DataFrame)

次に、予測不能なリサイクルを避けるために、「DataFrame」オブジェクトを複数のリストに分割します。基本的に、サイクリングが予測可能で、シミュレーターで正しい出力が生成されるように、各データサブセットを個別のリストに配置しています。

DFSplit <- split(DataFrame[ , "Data"], list(Do, Cl, In, Sa))

「DFSplit」オブジェクトには 384 個のリストがあります

length(names(DFSplit))

次に、リスト名を識別する関数「ids」を作成しました

ids <- function(Do, Cl, In, Sa){
    grep( paste( "^" , Do, "\\.",
                Cl, "\\.",
                In,
                "\\.", Sa,sep=""),
         names(DFSplit), value = TRUE)}

mapply(ids, Do, Cl, In, Sa, SIMPLIFY = FALSE)

各 'ids' 引数の長さは 6144 であると理解しています。mapply は、16 回繰り返される 384 個のリストを生成します。mapply が同じ名前を 16 回繰り返さないように ids 関数を変更するにはどうすればよいですか。醜くて非常にコストのかかる解決策として、私はユニークを使用しました。もっと根本的な解決策が必要です。

unique(mapply(ids, Do, Cl, In, Sa, SIMPLIFY = FALSE))

「DFSplit」リストを操作する関数も作成しました。以前の機能と同じ問題があります。問題は、前の関数を入力として受け入れることです。

dG <- function(Do,Cl, In, Sa){
    dg <- 100*
                (1-10^-( DFSplit[[ids(Do,  Cl, In, Sa)]] - DFSplit[[ids(0, Cl, In, Sa)]])) /
                (1-10^-( DFSplit[[ids(100, Cl, In, Sa)]] - DFSplit[[ids(0, Cl, In, Sa)]])) - Do
    dg}

mapply(dG, Do, Cl, In, Sa, SIMPLIFY = FALSE)

私がしようとしているのは、384 個のリストのそれぞれに dG 関数を適用することです。dG 機能も変更する必要があることを認めますが、その方法はわかりません。dG 関数への入力を、それぞれ 16 個の数字を含む 384 個のリストの名前にしたいと考えています。dG を適用した 384 リストを出力したいと考えています。

一緒に別の解決策を提案してください。重要なことは、「dG」関数をデータ セットに適用する必要があることです。

4

1 に答える 1

4

あなたが与え mapplyているものをよく見てください。 各オブジェクトには長さがあり6144ます。

  > length(Do)
  [1] 6144
  > length(Cl)
  [1] 6144
  > length(In)
  [1] 6144
  > length(Sa)
  [1] 6144
  > 

mapply 6144タプルを与えて、それぞれを反復するように求めています。要素
のリストを返しています。6144

それはまさにあなたがそうするように言っていることです


また、コードをコピーして貼り付けるだけで6144、各要素に要素が含まれる長いリストが生成され16ます。

  .
  .
  [[6141]]
   [1]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  1.421085e-14
  [12]  0.000000e+00  0.000000e+00  0.000000e+00 -1.421085e-14  0.000000e+00

  [[6142]]
   [1]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  1.421085e-14
  [12]  0.000000e+00  0.000000e+00  0.000000e+00 -1.421085e-14  0.000000e+00

  [[6143]]
   [1]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  1.421085e-14
  [12]  0.000000e+00  0.000000e+00  0.000000e+00 -1.421085e-14  0.000000e+00

  [[6144]]
   [1]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  1.421085e-14
  [12]  0.000000e+00  0.000000e+00  0.000000e+00 -1.421085e-14  0.000000e+00

したがって、あなたが説明したように、1要素の6144ではありません。

1 つは @Arun から、もう 1 つは @Paul Hiemstra からの 2 つの非常に優れたアドバイスを受け取りました。

おそらく、あなたが達成しようとしていることを説明してみてください。また、以前の質問を振り返り、賛成票を投じることを忘れずに、有益な回答をくれた人に感謝してください。

于 2013-03-16T15:19:21.057 に答える