计算 R 中多列中最高和最低的 10% 值
Calculate top & lowest ten percent values in multiple columns in R
加载库和示例数据:
library(MASS)
View(Cars93)
Cars93$ID=1:93
现在我想对 Cars93
进行子集化,以便新的 df(sub0l
和 sub0h
)具有所有列的所有 ID,但只有顶部(对于 df sub0h
) 和列 17:25 中的最低 10% 值(对于 df sub0l
)和其余值(df sub0l
的 11-100 四分位数和 df sub0h
的 0-90 四分位数) 可以更改为 NA。
这是我尝试创建两个 dfs,其中前 10% 或最低 10% 的值来自列 17:25:
sub0l <- do.call(rbind,by (Cars93,Cars93$ID,FUN= function(x)
subset(Cars93, (Cars93[,17:25] <= quantile(Cars93[,17:25], probs= .10)))))
sub0h <- do.call(rbind,by (Cars93,Cars93$ID,FUN= function(x)
subset(Cars93, (Cars93[,17:25] >= quantile(Cars93[,17:25], probs= .91)))))
我在对列的最高和最低十个四分位数进行子集化时出错:
Error in `[.data.frame`(Cars93, ,17:25) : undefined columns selected
Called from: `[.data.frame`(Cars93, ,17:25)
还有更好的选择吗?
我觉得下面returns你要找的是什么
sub0l <- cbind(Cars93[,1:16], sapply(Cars93[,17:25],
function(i) ifelse(i > quantile(i, probs=0.1, na.rm=T) | is.na(i), NA, i)))
sub0h <- cbind(Cars93[,1:16], sapply(Cars93[,17:25],
function(i) ifelse(i < quantile(i, probs=0.91, na.rm=T) | is.na(i), NA, i)))
sapply
函数循环遍历应用分位数函数的 data.frame 中的每个变量。在每次传递中,泛型函数通过 "i" 参数将变量作为向量访问。然后将其传递给 ifelse
函数。此函数查看向量 i 的每个元素并评估它是否通过测试。如果该元素通过测试,则为其分配 NA,如果失败,则返回其原始值。此过程非常适用于数字变量。
如果一些变量不是数字,那么您可以在 sapply
函数中添加额外的检查,如下所示:
sub0l <- cbind(Cars93[,1:16],
sapply(Cars93[,17:25],
function(i) {
if(is.numeric(i)) {
ifelse(i > quantile(i, probs=0.1, na.rm=T) | is.na(i), NA, i)))
}
else i
}))
sub0h <- cbind(Cars93[,1:16],
sapply(Cars93[,17:25],
function(i) {
if(is.numeric(i)) {
ifelse(i < quantile(i, probs=0.91, na.rm=T) | is.na(i), NA, i)
}
else i
}))
在开始上述操作之前,泛型函数检查向量 i 是否为数字类型(在 R 中,这是模式双精度或整数,请参阅 ?typeof
以了解核心元素类型的讨论在R)。如果此测试失败,则向量由 else i
返回。如果第一个测试通过,则上述过程开始。
加载库和示例数据:
library(MASS)
View(Cars93)
Cars93$ID=1:93
现在我想对 Cars93
进行子集化,以便新的 df(sub0l
和 sub0h
)具有所有列的所有 ID,但只有顶部(对于 df sub0h
) 和列 17:25 中的最低 10% 值(对于 df sub0l
)和其余值(df sub0l
的 11-100 四分位数和 df sub0h
的 0-90 四分位数) 可以更改为 NA。
这是我尝试创建两个 dfs,其中前 10% 或最低 10% 的值来自列 17:25:
sub0l <- do.call(rbind,by (Cars93,Cars93$ID,FUN= function(x)
subset(Cars93, (Cars93[,17:25] <= quantile(Cars93[,17:25], probs= .10)))))
sub0h <- do.call(rbind,by (Cars93,Cars93$ID,FUN= function(x)
subset(Cars93, (Cars93[,17:25] >= quantile(Cars93[,17:25], probs= .91)))))
我在对列的最高和最低十个四分位数进行子集化时出错:
Error in `[.data.frame`(Cars93, ,17:25) : undefined columns selected
Called from: `[.data.frame`(Cars93, ,17:25)
还有更好的选择吗?
我觉得下面returns你要找的是什么
sub0l <- cbind(Cars93[,1:16], sapply(Cars93[,17:25],
function(i) ifelse(i > quantile(i, probs=0.1, na.rm=T) | is.na(i), NA, i)))
sub0h <- cbind(Cars93[,1:16], sapply(Cars93[,17:25],
function(i) ifelse(i < quantile(i, probs=0.91, na.rm=T) | is.na(i), NA, i)))
sapply
函数循环遍历应用分位数函数的 data.frame 中的每个变量。在每次传递中,泛型函数通过 "i" 参数将变量作为向量访问。然后将其传递给 ifelse
函数。此函数查看向量 i 的每个元素并评估它是否通过测试。如果该元素通过测试,则为其分配 NA,如果失败,则返回其原始值。此过程非常适用于数字变量。
如果一些变量不是数字,那么您可以在 sapply
函数中添加额外的检查,如下所示:
sub0l <- cbind(Cars93[,1:16],
sapply(Cars93[,17:25],
function(i) {
if(is.numeric(i)) {
ifelse(i > quantile(i, probs=0.1, na.rm=T) | is.na(i), NA, i)))
}
else i
}))
sub0h <- cbind(Cars93[,1:16],
sapply(Cars93[,17:25],
function(i) {
if(is.numeric(i)) {
ifelse(i < quantile(i, probs=0.91, na.rm=T) | is.na(i), NA, i)
}
else i
}))
在开始上述操作之前,泛型函数检查向量 i 是否为数字类型(在 R 中,这是模式双精度或整数,请参阅 ?typeof
以了解核心元素类型的讨论在R)。如果此测试失败,则向量由 else i
返回。如果第一个测试通过,则上述过程开始。