【问题标题】:Error with group_by() %>% group_modify() when applying a custom function应用自定义函数时 group_by() %>% group_modify() 出错
【发布时间】: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_idtimepoint 对我的数据进行分组,然后对每个组应用一个函数来删除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 中的任何位置

标签: r function tidyverse


【解决方案1】:

我建议从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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多