r /如何将lowess平滑应用于最初在数据帧中无序的变量

时间:2013-12-23 15:21:58

标签: r smoothing

对于虹膜数据:

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。

任何建议如何解决这个或更聪明的方式来完成任务?谢谢!

1 个答案:

答案 0 :(得分:0)

我不清楚为什么要这样做,但是这里有一种方法可以对数据框的每一列进行独立排序并使其平滑:

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是矩阵而不是列表。虽然这种方法对于每个独立排序的列都很平滑,但为了使结果保持与原始数据框i相同的顺序,您需要“取消”它。这就是代码的[match(...)]部分正在做的事情。