【问题标题】:Exclude top and bottom 1% of data in a df in R排除 R 中 df 中顶部和底部 1% 的数据
【发布时间】:2018-06-22 04:37:23
【问题描述】:

对于示例数据框:

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

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

我已阅读 R 中有关修剪和分位数的信息,但似乎无法让它们发挥作用。

谁能帮忙解释一下我是怎么做到的:

一个。将这些末端设置为 NA

b.从我的数据框中删除这些四肢

【问题讨论】:

  • 你尝试了什么没有成功?你用的修剪功能是什么?

标签: r


【解决方案1】:

您可以检查每列的元素是否在 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))]

【讨论】:

    【解决方案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))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 2018-04-27
      • 2020-12-05
      • 2017-12-08
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      相关资源
      最近更新 更多