gpt4 book ai didi

r - R 中将函数分配给变量的 case_when() 的替代方案

转载 作者:行者123 更新时间:2023-12-02 03:32:19 25 4
gpt4 key购买 nike

(我希望)一个非常简单的问题。我想使用 case_when() 或等效的东西作为一个干净的解决方案来根据变量的值分配要使用的函数。所以,我想做这样的事情:

library(tidyverse)
library(lubridate)
library(nycflights13)
#small data frame of new years day flights from JFK
df1<-flights %>% filter(year==2013,month==1,day==1,origin=="JFK")

#use min_ind as an indicator (in practice this would be a variable from my dataset
min_ind<-1

现在,我想要一种简单的方法来根据 min_ind 的值将函数分配给 func_test 。我可以这样做:

  if(min_ind==1)
func_test<-min
if(min_ind!=1)
func_test<-max
#test it
func_test(df1$distance)
#reverse
min_ind<-0
if(min_ind==1)
func_test<-min
if(min_ind!=1)
func_test<-max
func_test(df1$distance)

这很好用。当 min_ind 为 1 时,我得到最小值,当它不为 1 时,我得到最大值。我希望能够做的是通过 case_when() 进行此分配,因为我有一组 4 或 5 个函数,我可能希望对数据中的值使用条件。这样的事情可能吗?

func_test<-case_when(
min_ind==1 ~ min,
min_ind!=1 ~ max
)

我收到错误代码 Error in value[[1]][rep(NA_integer_, m)] : “内置”类型的对象不可子集化

感谢您的任何建议。

最佳答案

case_when 实际上被设计为一个向量化函数。所以公式两边都应该是类似向量且长度相同或者可回收的东西。函数的行为不像集合。问题是,如果 min_ind 不是长度为 1 的向量,事情就会变得困惑。基本上它试图检查长度是否兼容。请参阅此处收到的错误消息

min_ind <- 1
func_test<-case_when(
min_ind==1 ~ 1:3,
min_ind!=1 ~ 4:6
)
# Error: RHS of case 1 (1:3) must be length 1 (the first output), not 3

因此,您最初收到的错误消息基本上是因为它试图将函数的长度扩展到与输入相同的长度,这对于函数来说没有意义。如果您确定length(min_ind==1)

,您可以将函数填充到列表中,然后提取第一个元素
min_ind <- 1
func_test<-case_when(
min_ind==1 ~ list(min),
min_ind!=1 ~ list(max)
)[[1]]

关于r - R 中将函数分配给变量的 case_when() 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51490377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com