排除R

时间:2018-06-21 19:42:07

标签: r

对于示例数据框:

set.seed (1000)
a <- rnorm(1000)
b <- seq(1, 1000, by=1)
df <- data.frame(b, a)

我想排除数据的前1%和后1%(列a)。

我已经阅读了有关R中的修整和分位数的信息,但似乎无法使其正常工作。

有人可以帮我解释一下吗?

a。将这些末端设置为NA

b。从我的数据框中删除这些肢体

2 个答案:

答案 0 :(得分:4)

您可以使用

检查每列的元素是否在0.01和0.99分位数之间,然后保留所有列在这些分位数之间的行。

keep <- Reduce(`&`, lapply(df, function(x) x >= quantile(x, .01) 
                                            & x <= quantile(x, .99)))


df[keep,]

如果您只想排除a在0.01和0.99分位数之外的行,则可以

keep <- df$a >= quantile(df$a, .01) & df$a <= quantile(df$a, .99) 

df[keep,]

keep <- lapply(df, function(x) x >= quantile(x, .01) 
                               & x <= quantile(x, .99))


df[keep$a,]

要将极端设置为NA,可以执行以下操作:

keep <- df$a >= quantile(df$a, .01) & df$a <= quantile(df$a, .99) 

df[!keep, 'a'] <- NA

data.table使这一过程变得更加容易。例如,要保留a在0.01和0.99分位数以内的行,可以执行

library(data.table)
setDT(df)

df[a %between% quantile(a, c(.01, .99))]

答案 1 :(得分:2)

使用dplyr::filterdplyr::between的解决方案可以通过以下方式实现:

library(dplyr)

# Checking only for column a. Top 1% and bottom 1% is removed 
df %>% filter(between(a, quantile(a, .01), quantile(a, .99)))

# Checking for column a & b. Top 1% and bottom 1% is removed
df %>% filter_all(all_vars(between(., quantile(., .01), quantile(., .99))))