0

コメントに従って編集: OPは計算したい:

(100 *  (1 - 10 ^ - (Do - Do[Do==0] )) ⎞ (1 - 10 ^ - (Do[Do==100] - Do[Do==0]) - Do

-RSClの、InSaの組み合わせごとにdata.frame


dG と呼ばれる関数をデータフレームに適用しようとしています。関数の引数の長さが異なるため、再利用によって予期しない結果が生じました。

この問題を修正するために、データフレームをリストに分割し、「ids」と呼ばれる関数で各リストを識別した後、dG 関数 (以下) を各リストに適用しようとしました。

  • 別の解決策を提案してください。参考までに、私の特定のリクエストは箇条書きで始まります

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

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)

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

関数「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)

上記の mapply は 6144 個のリストを生成します。mapply の出力を見ると、384 個の一意のリスト名があることがわかりますが、それぞれが 384*16=6144 のように 16 回繰り返されています。

  • mapply が同じ名前を 16 回繰り返さないように「ids」関数を変更するにはどうすればよいですか。

醜くて非常にコストのかかる解決策として、私はユニークを使用しました。もっと根本的な解決策が必要です。

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

dG 関数は、「DFSplit」リストのそれぞれで操作したい関数です。以前の ids 関数と同じ問題があります。ids 関数を入力として使用します。

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}

次のようにdGを使用しようとしましたが、それは私が望むものではありません。

dG(Do,Cl, In, Sa)

dG 関数の最後の部分 (- Do) とこの警告のみを評価しました

grep(paste("^", unique(Do), "\.", unique(Cl), "\.", unique(In), : 引数 'pattern' の長さは > 1 で、最初の要素のみが使用済み

  • dG 機能の変更を提案できますか

それから私はmapplyを試しました

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

mapply は、私のデータで関数を正しく評価しました。mapply は 6144 個のリストを生成します。mapply の出力は、基本的に 384 個の一意のリストであり、それぞれが 384*16=6144 で 16 回繰り返されていることに気付くでしょう。

  • dG 関数を変更して、無駄で時間のかかる繰り返しをなくすにはどうすればよいですか?

私の考えは次のとおりです。

  1. 方法がわからない最初の関数「ids」の繰り返しをなくします。
  2. 2 番目の関数の引数を変更して、引数の長さが 384 になるようにします。おそらく、リストの名前を入力引数として使用します。方法がわからない。

  3. 式 dG を変更し、(Do、Cl、In、Sa) 引数は使用しないでください。それぞれの長さは 6144 です。

4

1 に答える 1

5

アップデート:

あなたが@Rolandに行ったコメントは、以前の 関連する 質問のそれぞれに入力しなければならなかったすべてでした.これはかつて含まれていました.

プロセス全体を 1 行のコードで処理できます。

library(data.table)
myDT <- data.table(DataFrame)

myDT[ , "TVI" :=  100 * (1 - 10^-(Data - Data[Do==0])) / (1 - 10^-(Data[Do==100] - Data[Do==0])) 
      , by=list(Cl, In, Sa)]

# this is your Tonval Value Increase
myDT$TVI


元の答え:

あなたが達成しようとしていることはまだ非常に不明です。ただし、頭痛の世界を救うことができるはずの2つの概念があります.

まず、関数は必要ありませんids。より多くのマイレージを獲得できますexpand.grid:

myIDs <- expand.grid(unique(Do), unique(Cl), unique(In), unique(Sa))

# You can then use something like 
apply(myIDs, 1, paste, sep=".")
# to get the same results.  Or whatever other function suits

ただし、それも必須ではありません。


dGを使用した関数に相当するものを次に示しますdata.table

分割などの必要がないことに注意してくださいids
すべては のby関数によって処理されdata.tableます。

library(data.table)
myDT <- data.table(DataFrame)

myDT

dG_DT <- 
    100 * 
    1 - 10^(   myDT[ ,     Data, by=list(Do, Cl, In, Sa)][, Data] 
             - myDT[Do==0, Data, by=list(Do, Cl, In, Sa)][, Data]
            ) / 

    1 - 10^(   myDT[Do==100, Data, by=list(Do, Cl, In, Sa)][, Data]
             - myDT[Do==0,   Data, by=list(Do, Cl, In, Sa)][, Data]
            ) - 
    myDT[, Do]

dG_DT
于 2013-03-16T18:26:04.663 に答える