我開始將 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,然后應用到每個組funtion與在例外值洗掉行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 有沒有更好的方法來做到這一點?
謝謝你的盡心幫助
uj5u.com熱心網友回復:
我建議從rm.outliers函式回傳邏輯值并在filter.
library(dplyr)
rm.outliers <- function(data){
Q <- quantile(data, probs=c(.25, .75), na.rm = FALSE)
iqr <- IQR(data)
up <- Q[2] 1.5*iqr # Upper Range
low<- Q[1]-1.5*iqr # Lower Range
data < up & data > low
}
dataset %>%
group_by(patient_id, timepoint) %>%
filter(rm.outliers(Mean)) %>%
ungroup()
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/354144.html
下一篇:在R中取消嵌套串列列
