0

正直なところ、タイトルが何が起こっているのかを正確に説明しているかどうかはわかりませんが、ここにあります.

次のオブジェクト「Tempcheck」から始めるとします。

> str(Tempcheck)
'data.frame':   1872 obs. of  3 variables:
 $ Time           : POSIXlt, format: "2013-07-10 14:26:40" "2013-07-10 14:26:43" "2013-07-10 14:26:50" "2013-07-10 14:26:53" ...
 $ rawTemp        : int  107461 108551 109940 110258 110740 110890 111096 111164 111238 111296 ...
 $ rawConductivity: int  969903 1287631 1298627 1292063 1303909 1297249 1305610 1297557 1305070 1298703 ...

次に、関数を呼び出し、sapply を使用して一部のデータを正規化します。

TCalibration<- function(x){                        #this function normalizes data based on the calculated y intercept and slope
  dc <- (x*((Tempcor[[2]])))+((Tempcor[[1]]))   # y = 1/m*x + -1/b
  dc <- dc[[1]]
}
##calibrates rawTemp into real temp
Tempcheck$Temp <- sapply(Tempcheck[[2]],TCalibration)

Tempcor は、線形モデルからの係数を格納する以前のオブジェクトです。これが関連する場合は、後で投稿できます。

   > str(Tempcheck)
'data.frame':   1872 obs. of  4 variables:
 $ Time           : POSIXlt, format: "2013-07-10 14:26:40" ...
 $ rawTemp        : int  107461 108551 109940 110258 110740 110890 111096 111164 111238 111296 ...
 $ rawConductivity: int  969903 1287631 1298627 1292063 1303909 1297249 1305610 1297557 1305070 1298703 ...
 $ Temp           : num  23.6 23.9 24.3 24.4 24.5 ...

これはすべてうまくてダンディです!それまで ....

別の関数を呼び出します

 ConductivityCorrection <- function(x){
t <- 1+.02*(Tempcheck$Temp-25)  
EC25 <- (x/t) 
}

次に、もう一度 sapply を使用して Tempcheck を実行します

Tempcheck$rawCEC <-sapply(Tempcheck[[3]] ,ConductivityCorrection) 

前のコード行で得たものと同じ結果が得られると期待していましたが、奇妙なことが起こりました。

   str(Tempcheck$rawCEC)

num [1:1872, 1:1872] 998390 991974 983917 982090 979335 ...

このベクトルの長さは 1872^2 で、これは奇妙だと思いました。私の疑いは、それがラインから来ているということです

t <- 1+.02*(Tempcheck$Temp-25)

私はこれを別の方法で行うことができることを知っていますが、適用ファミリーを使用してよりよく学ぶように自分自身を強制しようとしています. とにかく助けていただければ幸いです。ありがとうございました!

このコードが私の問題を解決することを認識しています。

    Tempcheck$alphaT <- 1+.02*(Tempcheck$Temp-25)
Tempcheck$rawCEC  <- Tempcheck[[3]]/Tempcheck$alphaT

これを関数に変換し、Tempcheck[[3]] の列の各要素に適用する方法を探していました。

4

1 に答える 1

1

問題はTempcheck$TempConductivityCorrection関数がベクトルであるためベクトルtであるため、ベクトルx/tも返すことです。mapply代わりにorsapply(seq_along(Tempcheck[[3]]), ...)と index の両方を適宜使用できます。

ConductivityCorrection <- function(x){
  t <- 1+.02*(Tempcheck$Temp[x]-25)  
  EC25 <- (Tempcheck$rawConductivity[x]/t) 
}

sapply(seq_along(Tempcheck$Temp, ConductivityCorrection)

一般にapply、data.frame のすべての行に関数を使用している場合は、ソリューションをベクトル化し、apply関数を完全にスキップできます。

Temcheck$Temp <- Tempcheck$rawTemp * Tempcor[[2]] + Tempcor[[1]]

Tempcheck$rawCEC <- Tempcheck$rawConductivity / (1 + 0.02 * (Tempcheck$Temp - 25))

data.tableただし、これらのような単純な関数については、次の構文が非常に気に入っています。

DT <- data.table(Tempcheck)

DT[, rawCEC := rawConductivity / (1 + 0.02*Temp - 25)]`)
于 2013-07-14T21:49:06.730 に答える