首页 > 解决方案 > 即使代码中没有错误,为什么我的函数返回字符(0)?

问题描述

我正在寻求有关我创建的此功能的帮助。该函数的目的:首先,我想从数据框中提取一列,并按降序排列。然后,我按“H”、“M”和“L”对每个元素进行排名。我想对它们进行排名,例如前 33% 的项目应该有标签“H”,最后 33% 的项目应该被标记为“L”。其余的应标记为“M”。

这是代码:

ranking_prod <- function(data, column) {

  data <- arrange(data, desc(column))
  size <- length(data$column)
  first_third <- data$column[round(size / 3)]
  last_third <- data$column[round(size - (size / 3))]
  
  case_when(data$column > first_third ~ "H",
            data$column < last_third ~ "L",
            TRUE ~ "M")
}

但是,当我将此函数应用于以下数据框时:

> one <- c("a", "b", "c", "d", "e")
> two <- c(1, 2, 2, 1, 5)
> three <- c(2, 2, 2, 4, 5)
> dataframe <- data.frame(one, two, three)

它返回:

> rank_volume(dataframe, two)
character(0)

代码中的错误在哪里?为什么显示字符(0)作为结果?

标签: r

解决方案


我们可以使用[[代替,$也可以在传递不带引号的参数时转换为字符串。当我们用 bol 转换为symbol 时ensym,输入可以不加引号或加引号

ranking_prod <- function(data, column) {

  column <- rlang::ensym(column)
  colstr <- rlang::as_string(column)
  data <- dplyr::arrange(data, desc(!!column))
  size <- length(data[[colstr]])
  first_third <- data[[colstr]][round(size / 3)]
  last_third <- data[[colstr]][round(size - (size / 3))]
  
  dplyr::case_when(data[[colstr]] > first_third ~ "H",
            data[[colstr]] < last_third ~ "L",
            TRUE ~ "M")
}

-测试

ranking_prod(dataframe, two)
#[1] "H" "M" "M" "L" "L"
ranking_prod(dataframe, 'two')
#[1] "H" "M" "M" "L" "L"

推荐阅读