在数据帧上应用 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
我需要知道如何过滤数据框,以便只有属于 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