2017-07-07 85 views
0

我使用下面的代码尝试用特定的值替换低于底部2.5%和高于顶部97.5%的变量值。您可以执行该代码。它提供了开放的数据文件。替换异常值R中的2.5%,97.5%的代码错误

credit<-read.csv("http://freakonometrics.free.fr/german_credit.csv", header=TRUE) 
fun <- function(x){ 
    quantiles <- quantile(x, c(.025, .975)) 
    x[ x < quantiles[1] ] <- quantiles[1] 
    x[ x > quantiles[2] ] <- quantiles[2] 
    x 
} 
fun(credit) 

但是出现错误信息。

Error in `[.data.frame`(x, order(x, na.last = na.last, decreasing = decreasing)) : 
    undefined columns selected 

什么问题?我很乐意提供任何帮助!

+加评论

我发现上面的功能不会在数据帧的工作,但只在矢量工作。

我可以改变用下面的代码中的数据文件中每个变量的异常:

然而,我的数据文件中有这么多的变数,这是不方便的一个输入一个代码。

那么如何更改变量的异常值,即特定值不是pmax & pmin?

+0

问题是,您没有选择任何列,因为错误说。 'x'是整个数据帧。 –

+0

@Rich Scriven 感谢您的回复。但我不明白你的意思。你能用代码解释吗? –

+0

'分位数(x,c(.025,.975))'是问题线。试用'分位数(credit,c(.025,.975))'。你试图运行'分位数'的列是什么?它只适用于数字矢量,而不适用于整个数据框。 –

回答

0

只要将它应用到列上,实际上函数没有任何问题。我将使用mutate_atmutate_all(如果您真的想将其应用于全部列)的dplyr软件包。事情是这样的:

library(dplyr) 
credit_trunc <- credit %>% 
    mutate_at(vars(Credit.Amount, Creditability), funs(fun)) 

credit_trunc <- credit %>% 
    mutate_all(funs(fun)) 

,或者如果你还在你的数据帧具有(例如因素,字符),另一种类型的列,您可以使用:

credit_trunc <- credit %>% 
    mutate_if(is.numeric, funs(fun)) 

这将使您返回数据框,并根据您的需要修改所选/所有列/所有数字列。

+0

您是否检查过您的代码?如果我使用你的代码,我得到了这样的错误“mutate_impl(.data,dots)中的错误:因素是不允许的”我应该只使用连续值吗? –

+0

是的,我再次运行它。 mh ..你是否在读取read.csv和应用函数之间对数据做了些什么? – friep

+0

哦!对不起。 我的完整代码也以因子的形式处理数据。但是,我认为异常值不能存在于因子类型变量中。是对的吗? –