R语言 仅对数据集中选定的列循环boxplot.stats函数

qmelpv7a  于 2023-01-03  发布在  其他
关注(0)|答案(3)|浏览(134)

我正在尝试弄清楚如何创建一个循环,使我能够打印数据集中特定列的异常值。例如:如果我有列x(因子),y(因子),z(数值),t(数值),我只想让它对z和t做这件事。为此,我提出了一个代码,评估变量是数值还是整数,然后计算离群值。

for(i in df) {                                        
  print(boxplot.stats(df$z)$out)  
}

有没有关于如何继续的帮助?

u4vypkhs

u4vypkhs1#

我觉得你想要的是

varnames <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")
for(i in 1:4) {                                        
    print(boxplot.stats(iris[,varnames[i]])$out)  
}

有些东西改变了。首先,我有一个列名称的向量。我想从你说的你有一种方法来做到这一点。
其次,for现在有了一个反映该向量的索引,您可以通过获取长度来使其更具动态性。
第三,在循环中,我引用索引i,并使用它依次提取每个列。

w7t8yxp5

w7t8yxp52#

由于离群值的数量会有所不同,您可能更愿意以列表形式收集它们,以供进一步参考:

## example data iris:
iris |> lapply(\(col) boxplot(col, plot = FALSE)$out)

输出:

$Sepal.Length
numeric(0)

$Sepal.Width
[1] 4.4 4.1 4.2 2.0

$Petal.Length
numeric(0)

$Petal.Width
numeric(0)

$Species
numeric(0)
rkttyhzu

rkttyhzu3#

下面是一个函数,它首先查找数值列,然后查找那些列的异常值。

fun <- function(x) {
  i <- sapply(x, is.numeric)
  if(any(i))
    lapply(x[i], \(y) boxplot.stats(y)$out)
}

fun(iris)
# $Sepal.Length
# numeric(0)
#
# $Sepal.Width
# [1] 4.4 4.1 4.2 2.0
#
# $Petal.Length
# numeric(0)
#
# $Petal.Width
# numeric(0)

如果没有数值列,则函数返回NULL(不可见)。

fun(data.frame(X = letters))   # doesn't print the invisible return value

res <- fun(data.frame(X = letters))
res
# NULL

相关问题