如何在 R 中使用 lapply 消除异常

Posted

技术标签:

【中文标题】如何在 R 中使用 lapply 消除异常【英文标题】:How to get rid of anomalies using lapply in R 【发布时间】:2020-02-14 22:02:24 【问题描述】:

我有一个数据框列表,我正在尝试使用lapply 来消除我的数据中的异常,尝试使代码尽可能健壮,因为输入的数据会不断变化。

我正在尝试使用:

newdata <- lapply(ChaseSubSet, function()
  anomalies <- 0.02 > ChaseSubSet[,1] > 0.03
  anomalies = na
)

但是 a) 这不起作用 b) 我认为摆脱平均值超过 0.1 的值会更加稳健。我必须对数据的每一列应用不同的规则,但让它适用于列表中的所有 data.frames。我想使用 lapply 在最后生成一个列表。

我的数据如下:

我想对列表的所有 13 个数据框进行排序,它们都像这张图片。我想如果 value 的异常值被替换为 NA 我的想法是这将在以后使用不同长度的不同列产生最少的问题。

我还是新手,如果有任何不正确之处,我深表歉意。

【问题讨论】:

lapply(ChaseSubSet, function(x)subset(x,x[,1] - mean(x[,1]) 这样的?嘿,不太清楚 ChaseSubSet 是什么样的,以及你想如何过滤 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。 谢谢@StupidWolf 我可以问一个问题,该代码的哪一部分将摆脱满足这些要求的值是子集函数的作用?它会用 na 代替它们吗? ChaseSubSet 是数据帧列表还是该列表中的数据帧之一? 【参考方案1】:

如果数据帧列表为ChaseSubSet,则调用函数no_anomalies下方的lapply。请注意参数offset,如果您想从数据帧中的每个向量的平均值中移除超过0.1 的异常(离群值?),您可以设置该参数。

no_anomalies <- function(x, offset = 0.1, na.rm = TRUE)
  x.bar <- mean(x, na.rm = na.rm)
  away <- x < (x.bar - offset) | x > (x.bar + offset)
  is.na(x) <- which(away)
  x


newdata <- lapply(ChaseSubSet, function(DF)
  is_num <- sapply(DF, is.numeric)
  DF[is_num] <- lapply(DF[is_num], no_anomalies, offset = 0.1)
  DF
)

【讨论】:

谢谢@RuiBarradas,这很有帮助。如果您有时间,请回答两个问题: 1) 尽管代码中的这一行与 E 基数一样,第一列仍保持为非数字 2) 如果其中一个数字关闭,此代码将删除整个列,而不是仅删除该数字 1) 您确定该列是数字吗? class(df$thatcol) 返回什么?见this SO post 和this other SO post。 2) 也许你应该使用另一个标准来决定什么是关闭。异常值的去除并不容易,因为异常值的概念非常非常模糊。有一个包outliers 试图识别异常值。也许你应该看看并重新考虑你想要做什么。

以上是关于如何在 R 中使用 lapply 消除异常的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 的 lapply() 中引用正在操作的行

如何在 lapply (R) 中显式定义附加参数

如何使用lapply来计算r中列表中的唯一值

如何将 lapply 的输出保存(分配)到 R 中的单个变量中?

r 中的 T 检验:如何使用 lapply 函数更改 t 检验的 x 和 y 参数

如何在此数据框列的 R 中正确使用 apply?