【问题标题】:How to count all the outlier values in a row?如何连续计算所有异常值?
【发布时间】:2017-11-05 12:27:34
【问题描述】:

在 R 中(我很新)我正在尝试创建一个 outlier_count 变量,其中一个整数表示每行异常值的数量。

所以,假设我的数据集看起来像这样,并假设“10”是一个异常值:

    var1 var2 var3 var4 var5 var6 var7
a      1    1   10   10    1    1    1
b     10    1    1    1    1    1    1
c      1    1    1    1    1    1    1
d      1    1    1    1    1    1    1
e      1    1    1    1    1    1    1
f      1    1    1    1    1    1    1

我想得到类似的结果:

    var1 var2 var3 var4 var5 var6 var7 outlier_count
a      1    1   10   10    1    1    1             2
b     10    1    1    1    1    1    1             1
c      1    1    1    1    1    1    1             0
d      1    1    1    1    1    1    1             0
e      1    1    1    1    1    1    1             0
f      1    1    1    1    1    1    1             0

因此,在每一行中,我都知道有多少值是异常值。

我尝试了几个函数,但当单列为 NA 时,变量最终为 NA

有没有一种简单、防错的方法来做到这一点?

【问题讨论】:

  • 如果你能为df$var1提供一个最小的数据集,这样问题就可以重现,那么问题就更容易被发现了。
  • 那些不是"values per row",不管是否异常,df$var1 是一列。
  • 嗨!谢谢你俩。 @Heikki 我猜你可以使用任何你想要的数据集,比如iris[sample(nrow(iris), 10), ](当然只使用数字变量)。 @RuiBarradas 是的,我想知道 df$var1 值是否是特定行的异常值,并将其值添加到同一行的 outlier_count 变量中。
  • 数据样本 iris[sample(nrow(iris), 10), ] 没有 NA。
  • @Heikki 是的,插入一些 NA 值很容易,但您也可以使用空气质量:summary(airquality),Ozone 和 Solar.R 具有 NA 值。

标签: r dataframe


【解决方案1】:

在您在 cmets 中进行解释并使用预期输出进行编辑后,它变得非常简单。
先读入数据。

df <- read.table(text = "
    var1 var2 var3 var4 var5 var6 var7
a      1    1   10   10    1    1    1
b     10    1    1    1    1    1    1
c      1    1    1    1    1    1    1
d      1    1    1    1    1    1    1
e      1    1    1    1    1    1    1
f      1    1    1    1    1    1    1
", header = TRUE)

现在是代码。我将考虑低于或高于0.050.95 分位数的所有异常值。如果您愿意,请更改此设置。

out <- sapply(df, function(x) x < quantile(x, 0.05) | x > quantile(x, 0.95))
df$outlier_count <- rowSums(out)
df

请注意,您可以不显式创建中间变量out。并从上面的代码中制作一个单行代码。随你(由你决定。我更喜欢它有可读的代码。

【讨论】:

  • 谢谢!我添加了na.rm=TRUE 以避免在评估 NA 值时出错。然后我如何指定应该评估哪些列?假设我不想将var7 包含在总数中。
  • @afontcu 你可以使用sapply(df[, 1:6], ...)sapply(df[, -7], ...)。在第一种情况下,您说要将函数应用于哪些列,在第二种情况下,您不想将函数应用于哪些列。
  • 我最终使用了subset。非常感谢你!奇迹般有效。感谢您的耐心等待。
猜你喜欢
  • 2023-03-11
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2016-01-18
相关资源
最近更新 更多