2013-07-11 4 views
0

안녕하세요. 데이터 세트 처리에 도움이 필요합니다. 나는 14000 개의 행과 500 개의 열을 가지고 있으며 다른 열 그룹의 개별 행에 대한 첫 번째 파생 값의 최대 값을 얻으려고합니다. 내 데이터를 첫 번째 열이 변수 이름으로 데이터 프레임으로 저장했습니다. 내 데이터는 다음과 같습니다 종 열에서 각 변수에 대한 데이터 프레임의 값에 대한 최대 1 차 미분합 R

Species Spec400 Spec405 Spec410 Spec415 
1 AfricanOilPalm_1_Lf_1 0.2400900 0.2318345 0.2329633 0.2432734 
2 AfricanOilPalm_1_Lf_10 0.1783162 0.1808581 0.1844433 0.1960315 
3 AfricanOilPalm_1_Lf_11 0.1699646 0.1722618 0.1615062 0.1766804 
4 AfricanOilPalm_1_Lf_12 0.1685733 0.1743336 0.1669799 0.1818896 
5 AfricanOilPalm_1_Lf_13 0.1747400 0.1772355 0.1735916 0.1800227 

, 내가 예를 들어 Spec500에 Spec495에서 최대 유도체를 얻을 싶어요. 내가 오류를 범하기 전에 내가 한 일이다.
x<-c(495,500,505,510,515,520,525,530,535,540,545,550)##get x values of  reflectance(Spec495 to Spec500) 

y.data.f<-hsp[,21:32]##get row values for the required columns 

y<-as.numeric(y.data.f[1,])##convert to a vector, for just the first row of data 

library(pspline) ##Using a spline so a derivative maybe calculated from a list of numeric values 

는 정말 때문에 걸리는 시간의 루프를 사용하지 않도록하고 싶었다, 그러나 이것은 7861th 값이 다음 때까지이 루프가 실행 내가 지금까지

for(j in 1:14900) 
+ { y<-as.numeric(y.data.f[j,]) + a1d<-max(predict(sm.spline(x, y), x, 1)) 
+  write.table(a1d, file = "a1-d-appended.csv", sep = ",", 
+ col.names = FALSE, append=TRUE) + } 

알고있는 유일한 방법입니다 이 오류 :

Error in smooth.Pspline(x = ux, y = tmp[, 1], w = tmp[, 2], method = method, : 
NA/NaN/Inf in foreign function call (arg 6) 

나는 어쩌면 plyr 패키지를 사용하여 루프를 사용하지 않도록 할 수있는 방법이있을 확신하지만 난 그렇게하는 방법을 알아낼 수 없으며, 어떤 패키지 것은 얻을 가장 좋은 것입니다 max의 값 imum 유도체.

누구든지 통찰력이나 제안을 제공 할 수 있습니까? 미리 감사드립니다.

+0

이 게시물 http://stackoverflow.com/questions/3505701/r-을 도울 수 grouping-functions-sapply-vs-lapply-vs-apply-vs-tapply-vs-by-aggrega – dickoa

+1

이 오류로 끝나는 7861 번째 값은 무엇입니까? 이 기능을 사용하여 별도로 실행 해 보았습니까? 왜 이것이 루프의 문제라고 생각합니까? – Arun

+0

해당 루프의 첫 번째 줄에는 이중 할당이 있습니다. 예정된? 또한 최대 값을 원했지만 y 값은'y.data.f [j,]'행만큼 많은 원소를 가질 것입니다. –

답변

2

첫 번째 차이점은 x- 치수가 균등하게 분포되어있을 때 1 차 미분의 수치 아날로그입니다. 의 라인을 따라 그래서 뭔가 :

which.max(diff (predict(sm.spline(x, y))$ysmth))) 

...을 부드럽게 스플라인의 최대 (양의) 경사의 위치를 ​​반환합니다. 음수 또는 포레스트인지를 허용하는 최대 슬로프를 원하면 predict() $ ysmth 주위에 abs()를 사용합니다. 당신이 다음 Inf를하고 NaN이 모두 어려움을 취소합니다 is.finite의 인덱스를 사용하여이 아닌 유한 값으로 어려움을 겪고있는 경우 :

predy <- predict(sm.spline(x, y))$ysmth 
predx <- predict(sm.spline(x, y))$x 
is.na(predy) <- !is.finite(pred) 
plot(predx, predy, # NA values will not blow up R plotting function, 
        # ... just create discontinuities. 
        main ="First Derivative") 
+0

감사합니다. 위의 명령을 사용하여 첫 번째 행에 대한 데이터에 6의 값을 얻습니다. 그러나 (명령을 사용했을 때) 원래 대답은'0.006666018'입니다. – user2507608

+0

dput (y.data.f [1,])을 사용하여 첫 번째 행 값을 게시하지 않으면 도움을 줄 수 없습니다.게다가, diff() 접근법은 분모를 계산하지 않고 절대 값을 원한다는 것을 아직 명확하게 밝히지 않았다. –

+0

죄송합니다. 값의 첫 번째 행은 다음과 같습니다.'[1] 0.2440790 0.2505443 0.2606664 0.2775037 0.2983790 0.3292848 0.3609252 [8] 0.3838254 0.3952052 0.4002841 0.4049134 0.4065415'. 절대 값은 필요하지 않습니다. – user2507608