2013-07-14 1 views
0

솔직히 제목이 정확하게 무슨 일이 일어나는지 설명하지만 나는 여기있다.Sapply는 벡터를 벡터 벡터로 바꾸고 있습니다. 나는 생각한다.

은 가정하자 난 다음 함수를 호출하고 일부 데이터를 정상화 sapply 사용

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

다음 개체 "Tempcheck"로 시작합니다.

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) 
} 

그런 다음 나는 코드의 이전 라인을 가지고 같은 일을 얻기 위해 기다리고 있었다 Tempcheck

에 sapply 다시
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

함수가 수행해야하는 작업을 정확히 파악하는 데 필요한 정보가 충분하지 않지만 여기서 함수를 적용 할 필요가 거의 없다는 것은 거의 확실합니다. 이것이 모두 쉽게 벡터화되어야한다고 확신합니다. – joran

+0

나는이 작업들을 벡터화 할 수 있다는 것을 알았지 만 기능을 제대로 만들고 사용하는 방법을 알아 내려고 노력했다. 너는 무엇을 제안 하겠는가? – ZDwhite

답변

1

문제는 ConductivityCorrection 기능에 Tempcheck$Temp이 벡터는 점이다 따라서 t은 벡터이므로 x/t도 벡터를 반환합니다. 대신 mapply 또는 sapply(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) 

일반적으로, 당신이 data.frame의 모든 행에 함수를 보내고 apply 있다면, 당신은 당신의 솔루션을 벡터화 할 수 있으며 모두 apply 기능을 생략 :

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

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

를하지만, 같은 간단한 기능 이것들, 나는 문법을 정말로 좋아한다 :

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

관련 문제