对于示例数据框:
set.seed (1000)
a <- rnorm(1000)
b <- seq(1, 1000, by=1)
df <- data.frame(b, a)
我想排除数据的前1%和后1%(列a)。
我已经阅读了有关R中的修整和分位数的信息,但似乎无法使其正常工作。
有人可以帮我解释一下吗?
a。将这些末端设置为NA
b。从我的数据框中删除这些肢体
答案 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::filter
和dplyr::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))))