我正在尝试弄清楚如何创建一个循环,使我能够打印数据集中特定列的异常值。例如:如果我有列x(因子),y(因子),z(数值),t(数值),我只想让它对z和t做这件事。为此,我提出了一个代码,评估变量是数值还是整数,然后计算离群值。
for(i in df) { print(boxplot.stats(df$z)$out) }
有没有关于如何继续的帮助?
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,并使用它依次提取每个列。
for
i
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)
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(不可见)。
NULL
fun(data.frame(X = letters)) # doesn't print the invisible return value res <- fun(data.frame(X = letters)) res # NULL
3条答案
按热度按时间u4vypkhs1#
我觉得你想要的是
有些东西改变了。首先,我有一个列名称的向量。我想从你说的你有一种方法来做到这一点。
其次,
for
现在有了一个反映该向量的索引,您可以通过获取长度来使其更具动态性。第三,在循环中,我引用索引
i
,并使用它依次提取每个列。w7t8yxp52#
由于离群值的数量会有所不同,您可能更愿意以列表形式收集它们,以供进一步参考:
输出:
rkttyhzu3#
下面是一个函数,它首先查找数值列,然后查找那些列的异常值。
如果没有数值列,则函数返回
NULL
(不可见)。