【发布时间】:2021-12-22 06:05:53
【问题描述】:
我开始将 tidyverse 引入我的编码技能中,但在尝试在管道中使用自定义函数时遇到了一些麻烦。
我有两个不同时间点的患者数据集。示例数据:
dataset <- data.frame(patient_id = rep(1:5, each=6),
timepoint = rep(1:2, 15),
Mean = c(sample(100:130, 25),25,315,46,223,67),
Circ. = sample(40:99, 30)/100,
Perim. = sample(1000:2500, 30))
我想按patient_id 和timepoint 对我的数据进行分组,然后对每个组应用一个函数来删除Mean 列中具有异常值的行。这是我写的:
dataset <- dataset %>%
group_by(patient_id, timepoint) %>%
group_modify(~rm.outliers(.x,"Mean")) %>%
ungroup()
我在运行这一行时得到的错误是:
错误:无法对不存在的列进行子集化。 x 位置 41、119、124、112、130 等不存在。 ℹ 只有 1 列。
这让我觉得这与删除异常值后保持分组有关,但我不知道如何处理。
rm.outliers 是一个自定义函数,可删除平均值超过第一个四分位数或第三个四分位数以上 1.5 个四分位距 (IQR) 的任何行。它适用于单个数据框,但我不太习惯编写函数,所以这里可能会出现一些错误:
rm.outliers <- function(data, column){
Q <- quantile(data[,c(column)], probs=c(.25, .75), na.rm = FALSE)
iqr <- IQR(data[,c(column)])
up <- Q[2]+1.5*iqr # Upper Range
low<- Q[1]-1.5*iqr # Lower Range
data <- data[data[,c(column)] < up & data[,c(column)] > low, ]
data
}
我做错了什么?使用 tidyverse 有更好的方法吗?
感谢您提供的任何帮助
【问题讨论】:
-
将
data[,c(column)]替换为data[[column]]在rm.outliers中的任何位置