R 中分组数据帧的 DBSCAN 矩阵强制输入问题

问题描述 投票:0回答:0

我正在尝试使用包含多个组的函数将 dbscan 应用于数据框,但是我收到一条错误消息,指出 x 必须是矩阵:

Adding missing grouping variables: `group`
Error in `summarise()`:
! Problem while computing `outlier_index = list(detect_outliers(.))`.
i The error occurred in group 1: group = "a".
Caused by error in `dbscan::dbscan()`:
! x has to be a numeric matrix.

我已经检查了 dbscan 的帮助文档,它似乎可以将数据框用作 x 参数:

我的函数采用一个数据框、一个用于分组的变量和 2 个额外的参数来计算每个点是否为异常值。

这是一个复制我正在使用的数据的示例数据集:

df <- data.frame(
  group = rep(letters[1:3], each = 10),
  value1 = rnorm(30),
  value2 = rnorm(30),
  value3 = rnorm(30)
)

这是我定义的函数:

# INSTALL PACMAN
if (!require("pacman", character.only = TRUE)) {
  install.packages("pacman")
}

# LOAD THE NECESSARY LIBRARIES
pacman::p_load(dplyr, dbscan)

remove_outliers <- function(data, group_var, outlier_threshold, outlier_cols) {
  # DEFINE A FUNCTION TO REMOVE OUTLIERS
  detect_outliers <- function(x) {
    #x_num <- as.matrix(select(x, {{ outlier_cols }}))
    outlier_index <- which(dbscan::dbscan(x, eps = outlier_threshold, minPts = 5)$cluster == -1)
    return(outlier_index)
  }
  # GROUP BY GROUP AND APPLY THE DETECT OUTLIER FUNCTION TO EACH GROUP
  outliers <- data %>%
    group_by(across({{ group_var }})) %>%
    summarise(outlier_index = list(detect_outliers(.)))

  # UNNEST THE OUTLIERS DATA FRAME AND REMOVE ANY OUTLIER POINTS
  data_clean <- data %>%
    left_join(outliers %>% unnest(outlier_index), by = {{ group_var }}) %>%
    filter(is.na(outlier_index))

  return(data_clean)
}

然后我通过这个调用使用这个函数:

test <- remove_outliers(data = df, group_var = group, outlier_threshold = 2, outlier_cols = c("value1", "value3"))

根据帮助文件,我的输入 df 是一个数据框,我还明确尝试通过在

outlier_cols
函数中添加注释列将输入
detect_outlier
转换为矩阵。

任何能让我克服这个错误的帮助都将不胜感激。

r dplyr outliers dbscan
© www.soinside.com 2019 - 2024. All rights reserved.