2013-07-14 98 views
0

老實說,我不確定標題是否準確地描述了發生了什麼,但是在這裏。Sapply正在將矢量變成矢量矢量..我想

假設我開始用下面的對象「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 ... 

這一切都很好,很棒! UNTIL ....

我調用另一個函數

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,我認爲這是奇怪的。我suspision是,它來自於線

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

我知道我可以做這一種不同的方式,但我試圖迫使我自己使用的申請家庭,更好地瞭解它。無論如何,任何幫助將不勝感激。謝謝!

我知道這段代碼解決了我的問題。

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

我一直在尋找一種方式把它變成一個功能,並適用於每個元素Tempcheck的列[[3]]

+0

您的函數'CondictivityCorrection'不顯式返回任何東西。事實上,我認爲你對你的兩個函數都感到困惑,因爲它們返回的是什麼(如果有的話)。 – joran

+0

這裏沒有足夠的信息來掌握_exactly_你的函數應該做什麼,但我幾乎可以肯定的是絕對沒有必要在這裏應用函數。我覺得這個應該都很容易做到矢量化。 – joran

+0

我知道我可以對這些操作進行矢量化,但我想我會挑戰自我,想出如何正確地製作和使用功能。你會建議什麼? – ZDwhite

回答

1

的問題是,Tempcheck$TempConductivityCorrection函數是一個向量所以t是一個向量,因此x/t也返回一個向量。相反,您可以使用mapplysapply(seq_along(Tempcheck[[3]]), ...)並相應地編制索引。

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)]`) 
+0

我還沒有機會玩data.table包,但我會。前面的代碼行很好用!問題是,我怎麼會想到做這樣的事情。我感覺好像在思考/去創造功能方面缺少一些東西。你可以解釋一下seq_along()。再次感謝您的幫助! – ZDwhite

+0

你可以閱讀'seq_along'的幫助,但是它的序列和'1:length(x)'類似,但是更安全一些。一般來說''R'和矢量化語言稍微習慣了,如果你是從一個不是的,而是繼續探索和提出問題;你會到達那裏。 – Justin