在数据帧上应用 quantile() 函数

Apply quantile() function on a dataframe

我需要知道如何过滤数据框,以便只有属于 quantile 3 (Q3, 0.75) 的结果出现在某些特定列中。我会试着解释我自己。我有以下数据框:

https://drive.google.com/file/d/1blYWBXCrXpH37Wz4r0mVJGbwFsdesGi-/view?usp=sharing

我需要 returns table 的代码,其中包含所有列,并且所有行都满足以下列的 Q3 (0.75) 中的条件:

educ, salario, salini, tiempemp, expprev

有什么想法吗? 先谢谢大家!


我已经通过手动计算分位数并进行条件过滤暂时解决了这个问题,如下所示。有什么方法可以改进这个解决方案吗?:

quantile(empleados$educ, .75)
quantile(empleados$salario, .75)
quantile(empleados$salini, .75)
quantile(empleados$tiempemp, .75)
quantile(empleados$expprev, .75)


data.frame(empleados)
arrange(filter(empleados, educ >= 12, salario >= 28500, salini >= 14250, tiempemp >= 88, expprev >= 122.25, salario))


ok <- arrange(filter(empleados, educ >= 12, salario >= 28500, salini >= 14250, tiempemp >= 88, expprev >= 122.25, salario))
View(ok)

我已经通过手动计算分位数并进行条件过滤暂时解决了这个问题,如下所示。有什么方法可以改进这个解决方案吗?

quantile(empleados$educ, .75)
quantile(empleados$salario, .75)
quantile(empleados$salini, .75)
quantile(empleados$tiempemp, .75)
quantile(empleados$expprev, .75)


data.frame(empleados)
arrange(filter(empleados, educ >= 12, salario >= 28500, salini >= 14250, tiempemp >= 88, expprev >= 122.25, salario))


ok <- arrange(filter(empleados, educ >= 12, salario >= 28500, salini >= 14250, tiempemp >= 88, expprev >= 122.25, salario))
View(ok)

我们可以在特定列上使用 mutate_at,然后在满足所有值的 filter_at 行上使用 filter_at

library(dplyr)
cols <- c("educ", "salario", "salini", "tiempemp", "expprev")

Empleados %>% 
  mutate_at(cols, list(col = ~. > quantile(., 0.75))) %>%
  filter_at(vars(ends_with('col')), all_vars(.)) %>%
  select(-ends_with('col'))

#   id sexo    fechnac educ catlab salario salini tiempemp expprev
#1  11    2   2/7/1950   16      1   30300  16500       98     143
#2 134    2 11/10/1941   16      3   41550  24990       89     285

使用基础 R 的版本

# downloaded data file located here...
df <- read.csv('~/Downloads/Empleados.dat', sep = '\t')
numerics <- c("educ", "salario", "salini", "tiempemp", "expprev")
quantiles <- sapply(numerics, function(n) quantile(df[,n])[4])
quantilenames <- names(quantiles)
comparison <- data.frame(mapply(function(x,y) df[,y] >= quantiles[x], quantilenames, numerics))
comparison$alltrue <- apply(comparison, MARGIN = 1, all)

df.1 <- cbind(df, comparison)

df.1[df.1$alltrue,]
#    id sexo    fechnac educ catlab salario salini tiempemp expprev educ.75. salario.75. salini.75. tiempemp.75. expprev.75. alltrue
#6   11    2   2/7/1950   16      1   30300  16500       98     143     TRUE        TRUE       TRUE         TRUE        TRUE    TRUE
#7   14    2  2/26/1949   15      1   35100  16800       98     137     TRUE        TRUE       TRUE         TRUE        TRUE    TRUE
#21  74    2  4/28/1933   15      1   33900  19500       93     192     TRUE        TRUE       TRUE         TRUE        TRUE    TRUE
#50 134    2 11/10/1941   16      3   41550  24990       89     285     TRUE        TRUE       TRUE         TRUE        TRUE    TRUE