R 按条件从数据帧列表中删除异常值
我尝试创建一个函数,通过cooks距离从数据帧列表中删除多个异常值。 目前存在一些问题:R 按条件从数据帧列表中删除异常值,r,lm,outliers,R,Lm,Outliers,我尝试创建一个函数,通过cooks距离从数据帧列表中删除多个异常值。 目前存在一些问题: 我可以将第1部分表述为函数吗?我尝试了一些不可行的方法。我想为lm使用几个不同的变量,所以如果我可以使用colnumbers和数据帧的正则表达式语法作为输入参数,那就太好了 第2部分-绘图文件名不正确。它将列表中每个数据帧中的第一个观察值作为文件名。我怎样才能纠正这个问题 第3部分:不创建没有异常值的数据帧。打印消息后,函数结束。我找不到我的错误 数据(iris) iris.lst一般来说,在全局环境
数据(iris)
iris.lst一般来说,在全局环境中创建多个数据帧不是一个好的做法。列表总是一个更好的选择,它们易于管理
第一部分-
您可以在一个lappy
函数中组合多个步骤。在第1部分中,我们在同一个lappy
调用中一起应用lm
和cooks.distance
函数
master_data <- split(iris[, 1:2], iris$Species)
data <- lapply(master_data, function(x) {
cooks.distance(lm(Sepal.Length ~ Sepal.Width, data = x))
})
new_names <- paste0(levels(iris$Species),"_data")
names(data) <- new_names
第三部分-
我不太清楚您希望如何执行第3部分,但现在我将分别显示异常值和数据
remove_influential_cases <- function(x, y){
inds <- x > 3*mean(x, na.rm=TRUE)
y[!inds, ]
}
result <- Map(remove_influential_cases, data, master_data)
删除有影响力的案例您好,非常感谢。我尽我最大的努力在将来处理列表。关于第3部分的棘手之处在于,我想从原始数据帧中删除异常值,而不是从具有cooks距离的列表中删除。对于单个数据帧来说很容易。。。如果您只需要OG_DF[!COOK_DF_INDEX],那么对于iris,原始数据帧有4列。因此,我尝试提取每个数据帧的row.name,它与cooks距离数据帧相同。但不知怎的,我失败了……cooks距离矩阵是根据测试条件(3 x平均CD)通过过滤来识别异常值的。嗨,我会在晚上检查它,让你知道它是否有效。到目前为止,我还没有遇到Map函数。我已经找到了另一个解决方案,我稍后也会发布!
plots <- function(x, y){
jpeg(file=paste0(y,".jpeg"))
plot(x, pch="*", cex=2, main="Influential cases by Cooks distance")
abline(h = 3*mean(x, na.rm=T), col="red") # add cutoff line
text(x=1:length(x)+1,y=x,labels=ifelse(x > 3*mean(x, na.rm=T),y,""), col="red")
dev.off()
}
Map(plots, data, names(data))
remove_influential_cases <- function(x, y){
inds <- x > 3*mean(x, na.rm=TRUE)
y[!inds, ]
}
result <- Map(remove_influential_cases, data, master_data)