如何在 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 消除异常的主要内容,如果未能解决你的问题,请参考以下文章
如何将 lapply 的输出保存(分配)到 R 中的单个变量中?