2013-12-23 27 views
0

對於虹膜數據最初是無序的變量:R /如何LOWESS平滑適用於在數據幀

i <- iris[,1:4] # numerical variables in Iris-data 
ord_i <- order(i[,1]) # order data frame by variable 1 ascending order 
low_i <- lowess(i[ord_i,1], f=1/10)[2] # compute lowess for ordered variable 1 
i[ord_i,1] <- low_i # insert new values to original data 

是成功的。我嘗試和失敗來概括成一個功能是:

func1 <- function(x){ 
    func1_aux <- function(x,y){ 
    ord_x <- order(x[,y]) 
    low_y <- lowess(x[ord_x, y], f=1/10)[2]}  
apply(x, 2, func1_aux)} 

func1(i) 
Error in x[, y] : incorrect number of dimensions 

我懷疑問題出在名字y和數據幀x如何變來 從適用於func1_aux。

任何意見如何解決這個或更聰明的方式來完成任務?謝謝!

+0

在你的'func1_aux'行之後插入'browser()',獲取'func1'函數並逐步完成代碼。 –

回答

0

這我不清楚你爲什麼會想這樣做,但這裏有一個方法來獨立排序的數據幀的每一列,適合平滑給它的LOWESS:

i <- iris[, 1:4] 
k <- apply(i, 2, function(x) lowess(x[order(x)], f=1/10)[[2]][match(x, x[order(x)])]) 

使用雙括號, [[2]],確保結果k是一個矩陣而不是一個列表。儘管這種方法適合於每個列獨立排序,但爲了保持與原始數據幀相同的順序,您需要「unsort」它。這就是代碼的[match(...)]部分所做的事情。

+0

謝謝。這解決了這個問題。我將學習搭配功能。 – user2968765