在数据框的 5 列中找到最高阈值以获得 n 条记录
Find highest threshold across 5 columns of dataframe to obtain n records
所以我有一个包含 5 列的数据框,其中包含 9031 个观察值。列的每条记录都是该列中所有值的百分位数排名。
我的目标是找到最高的百分位数阈值以应用于所有五个列以获得 n 条记录。
例如,假设我的目标是将数据框中的记录数减少到 1000 条记录,为了获得 1000 条记录,我需要应用于所有 5 列的最高阈值是多少?
Variance_Five_Metrics$Zips medium medium.1 medium.2 medium.3 medium.4
1 00501 0.8395527 0.8671243 0.9894807 0.6567379 0.45875318
2 00544 0.8075518 0.8687853 0.9883734 0.6345920 0.45100210
3 01432 0.6124460 0.2460414 0.9701030 0.9103089 0.17107740
4 01434 0.7869560 0.3000775 0.9268077 0.8760935 0.11859152
5 01450 0.6642675 0.2451556 0.9919167 0.9585871 0.09600266
假设我的数据框的前五个记录(9031 条记录中的)。如果我想将我的 df 缩小到恰好 1000 条记录,我需要应用到所有 5 列的截止点是多少,以便获得恰好 1000 条记录,其中所有 5 列的值都低于该截止点?
我可能没有很好地解释这一点,但我将不胜感激任何指导
谢谢
我不确定这是否正是您要找的。我对列求和,取顶部的 n
数字,然后为该子集提供最小参数。
GetThresholds<-function(data,n){
data$summed<-rowMeans(data[,2:6])
data<-data[order(-data$summed),]
data.small<-head(data,n=n)
output<- c(min(data.small[,2]),
min(data.small[,3]),
min(data.small[,4]),
min(data.small[,5]),
min(data.small[,6]))
names(output)<-names(data)[2:6]
return(output)
}
GetThresholds(df,3)
> GetThresholds(df,3)
medium medium.1 medium.2 medium.3 medium.4
0.7869560 0.3000775 0.9268077 0.6345920 0.1185915
如果我对问题的理解正确,那么您可以通过简单的按行最小值来实现。这是获取截止值的一行:
quantile(apply(MAT, 1, min), p=1-(100/nrow(MAT)))
您需要将“100”替换为您自己想要的行数。
下面的简短说明
假设您有一个包含 5 列的矩阵:
MAT <- matrix(rnorm(10000), ncol=5)
您想找到一个值,该值在对所有列进行截断后将留下 100 行:
n <- 100
为了包含整行,它的所有 5 列都需要高于截止值。这与要求该行的最小值高于截止值相同。
MIN <- apply(MAT, 1, min)
现在我们可以找到截断的百分位数。
p <- 1 - (n/length(MIN))
您需要 100 个值,因此上面的值只是 1 - 100/1000,即 0.9。所以你的截止值将是 >= 0.9 个百分点。
获取百分位数:
q <- quantile(MIN, probs=p)
成功了吗?
sum(MAT[,1] > q & MAT[,2] > q & MAT[,3] > q & MAT[,4] > q & MAT[,5] > q)
[1] 100
使用dplyr
的示例:
library(dplyr)
d <- read.table(
header = TRUE,
text = "
zips medium medium.1 medium.2 medium.3 medium.4
00501 0.8395527 0.8671243 0.9894807 0.6567379 0.45875318
00544 0.8075518 0.8687853 0.9883734 0.6345920 0.45100210
01432 0.6124460 0.2460414 0.9701030 0.9103089 0.17107740
01434 0.7869560 0.3000775 0.9268077 0.8760935 0.11859152
01450 0.6642675 0.2451556 0.9919167 0.9585871 0.09600266
")
cutoff <- 3 # number of rows to keep (change to 1000 for your example)
d %>%
mutate(p_min = pmin(medium, medium.1, medium.2, medium.3, medium.4)) %>%
arrange(p_min) %>%
.$p_min %>%
'['(., cutoff)
所以我有一个包含 5 列的数据框,其中包含 9031 个观察值。列的每条记录都是该列中所有值的百分位数排名。
我的目标是找到最高的百分位数阈值以应用于所有五个列以获得 n 条记录。
例如,假设我的目标是将数据框中的记录数减少到 1000 条记录,为了获得 1000 条记录,我需要应用于所有 5 列的最高阈值是多少?
Variance_Five_Metrics$Zips medium medium.1 medium.2 medium.3 medium.4
1 00501 0.8395527 0.8671243 0.9894807 0.6567379 0.45875318
2 00544 0.8075518 0.8687853 0.9883734 0.6345920 0.45100210
3 01432 0.6124460 0.2460414 0.9701030 0.9103089 0.17107740
4 01434 0.7869560 0.3000775 0.9268077 0.8760935 0.11859152
5 01450 0.6642675 0.2451556 0.9919167 0.9585871 0.09600266
假设我的数据框的前五个记录(9031 条记录中的)。如果我想将我的 df 缩小到恰好 1000 条记录,我需要应用到所有 5 列的截止点是多少,以便获得恰好 1000 条记录,其中所有 5 列的值都低于该截止点?
我可能没有很好地解释这一点,但我将不胜感激任何指导
谢谢
我不确定这是否正是您要找的。我对列求和,取顶部的 n
数字,然后为该子集提供最小参数。
GetThresholds<-function(data,n){
data$summed<-rowMeans(data[,2:6])
data<-data[order(-data$summed),]
data.small<-head(data,n=n)
output<- c(min(data.small[,2]),
min(data.small[,3]),
min(data.small[,4]),
min(data.small[,5]),
min(data.small[,6]))
names(output)<-names(data)[2:6]
return(output)
}
GetThresholds(df,3)
> GetThresholds(df,3)
medium medium.1 medium.2 medium.3 medium.4
0.7869560 0.3000775 0.9268077 0.6345920 0.1185915
如果我对问题的理解正确,那么您可以通过简单的按行最小值来实现。这是获取截止值的一行:
quantile(apply(MAT, 1, min), p=1-(100/nrow(MAT)))
您需要将“100”替换为您自己想要的行数。
下面的简短说明
假设您有一个包含 5 列的矩阵:
MAT <- matrix(rnorm(10000), ncol=5)
您想找到一个值,该值在对所有列进行截断后将留下 100 行:
n <- 100
为了包含整行,它的所有 5 列都需要高于截止值。这与要求该行的最小值高于截止值相同。
MIN <- apply(MAT, 1, min)
现在我们可以找到截断的百分位数。
p <- 1 - (n/length(MIN))
您需要 100 个值,因此上面的值只是 1 - 100/1000,即 0.9。所以你的截止值将是 >= 0.9 个百分点。
获取百分位数:
q <- quantile(MIN, probs=p)
成功了吗?
sum(MAT[,1] > q & MAT[,2] > q & MAT[,3] > q & MAT[,4] > q & MAT[,5] > q)
[1] 100
使用dplyr
的示例:
library(dplyr)
d <- read.table(
header = TRUE,
text = "
zips medium medium.1 medium.2 medium.3 medium.4
00501 0.8395527 0.8671243 0.9894807 0.6567379 0.45875318
00544 0.8075518 0.8687853 0.9883734 0.6345920 0.45100210
01432 0.6124460 0.2460414 0.9701030 0.9103089 0.17107740
01434 0.7869560 0.3000775 0.9268077 0.8760935 0.11859152
01450 0.6642675 0.2451556 0.9919167 0.9585871 0.09600266
")
cutoff <- 3 # number of rows to keep (change to 1000 for your example)
d %>%
mutate(p_min = pmin(medium, medium.1, medium.2, medium.3, medium.4)) %>%
arrange(p_min) %>%
.$p_min %>%
'['(., cutoff)