【问题标题】:How to get rid of anomalies using lapply in R如何在 R 中使用 lapply 消除异常
【发布时间】: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 是数据帧列表还是该列表中的数据帧之一?

标签: r list dataframe


【解决方案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 postthis other SO post
  • 2) 也许你应该使用另一个标准来决定什么是关闭。异常值的去除并不容易,因为异常值的概念非常非常模糊。有一个包outliers 试图识别异常值。也许你应该看看并重新考虑你想要做什么。
猜你喜欢
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2020-03-12
  • 2021-08-31
  • 2015-11-23
  • 2016-06-29
  • 2019-04-11
相关资源
最近更新 更多