r - 即使代码中没有错误,为什么我的函数返回字符(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)作为结果?
解决方案
我们可以使用[[
代替,$
也可以在传递不带引号的参数时转换为字符串。当我们用 bol 转换为sym
bol 时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"
推荐阅读
- swift - 如何用swift将屏幕分成3个梯形按钮?
- typescript - 泛型数组
- javascript - 如何在打字稿中对数组内的总价格求和并在角度7中调用它
- python - RuntimeError: LookupError: KeyError: No devices found for ----->Device Address: b200
- jquery - 如何通过 JQuery AJAX ASP.NET 发送空数据
- excel - 将 For/Next 与变量一起使用时遇到问题
- c# - 将控件属性绑定到 BindingSource
- docker - 如何将 VS Code 调试器附加到在 docker 容器中运行的 .NET Core 监视进程
- android - react-native-camera中YUV_420_888格式的算法旋转
- kivy - Kivy 文本输入。使用 Clock.schedule_once() 设置文本