2013-07-11 27 views
0

美好的一天,我在寻找一些帮助处理我的数据集。我有14000行和500列,我试图获得不同列组中单个行的一阶导数的最大值。我将数据保存为数据框,第一列是变量的名称。我的数据是这样的:数据帧中的值的最大一阶导数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 

对于每一个在种类列中的变量,我想从Spec495最大导数Spec500例如。这是我在遇到错误之前所做的。

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 

我真的想避免使用,因为它需要时间的循环,但这是我所知道的迄今

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

直到那时7861th值获得的唯一途径这个循环运行起来这个错误:

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

我相信一定有避免使用一个循环,也许使用plyr包的方式,但我无法弄清楚如何做到这一点,也没有哪个软件包将是最好的获得最大值亚姆派生。

任何人都可以提供一些见解或建议吗?在此先感谢

+0

这篇文章可以帮助http://stackoverflow.com/questions/3505701/r- grouping-functions-sapply-vs-lapply-vs-apply-vs-tapply-vs-by-vs-aggrega – dickoa

+1

那么,在这个错误中结束的第7861个值是什么?你有没有尝试单独运行这个功能?你为什么认为这是循环的问题? – Arun

+0

您在该循环的第一行中有一个双赋值。意?此外,你说你想要的最大值,但是看起来你的y值将会与'y.data.f [j,]' –

回答

2

第一个不同之处是当x维平均间隔时,一阶导数的数值类比。所以沿线的东西:

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

...将返回平滑样条的最大(正)斜率的位置。如果您希望最大斜率允许它为负值或正值,则可以在predict()$ ysmth周围使用abs()。如果您有然后使用is.finite的指数会清除的INF和NaN的困难与非有限值的困难:

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