使用 if() 在 dplyr 管道链中使用 select()

2023-12-06

已经阅读了这两篇文章:

  • dplyr 包可以用于条件变异吗?
  • R 使用管道运算符时的条件评估 %>%

我正在使用 Shiny input$selector,如果用户选择了特定值,我希望我的数据框与其他值不同。

这是一条链:

  filtered_funnel <-  reactive({
    lastmonth_funnel %>%
      filter(input$channel == "All" | Channel == input$channel) %>%
      filter(input$promo == "All" | Promo == input$promo) %>%

      ## HERE IS WHERE I'M STRUGGLING
      {if(input$promo != "none") select(., c("Channel", "Promo", "ShippingDetails", "Checkout", "Transactions"))} %>%


      gather(Funnel, Sessions, -Channel, -Promo) %>%
      group_by(Channel, Promo, Funnel) %>%
      summarise(Sessions = sum(Sessions))
  })

如果用户输入不等于“none”,我想选择变量“Channel”、“Promo”、“ShippingDetails”、“Checkout”和“Transactions”。

我尝试了上面问题行的一些变体,但不断出现错误:

当我在管链中尝试这个时

{if(input$promo != "none") select(., c("Channel", "Promo", "ShippingDetails", "Checkout", "Transactions"))} %>% 

我收到这个错误:

警告:错误:所有 select() 输入必须解析为整数列 职位。以下情况则不: * c("渠道"、"促销"、"送货详情"、"结账"、"交易")

我也尝试过:

{if(input$promo != "none") select(., c(Channel, Promo, ShippingDetails, Checkout:Transactions))} %>%

这实际上会运行直到我在输入中选择“none”,在这种情况下我得到

错误:is.character(x) 不为 TRUE

当我尝试这个时,我遇到了同样的错误:

{ifelse(input$promo != "none", select(., c(Channel, Promo, ShippingDetails, Checkout:Transactions)), .)} %>%

如何在 dplyr 管道链中嵌套一个 select 语句,该语句表示 if input$promo != "none" then select Channel、Promo、ShippingDetails、Checkout:Transactions 来自管道中传递的对象?

-- 这是随机生成数据的 dput--

> dput(lastmonth_funnel)
structure(list(Channel = c("Facebook", "Youtube", "SEM", "Organic", 
"Direct", "Email", "Facebook", "Youtube", "SEM", "Organic", "Direct", 
"Email", "Facebook", "Youtube", "SEM", "Organic", "Direct", "Email", 
"Facebook", "Youtube", "SEM", "Organic", "Direct", "Email", "Facebook", 
"Youtube", "SEM", "Organic", "Direct", "Email"), Promo = c("none", 
"none", "none", "none", "none", "none", "banannas", "banannas", 
"banannas", "banannas", "banannas", "banannas", "carrots", "carrots", 
"carrots", "carrots", "carrots", "carrots", "pears", "pears", 
"pears", "pears", "pears", "pears", "apples", "apples", "apples", 
"apples", "apples", "apples"), Sessions = c(6587, 3015, 6316, 
11219, 8117, 6473, 12464, 14032, 14318, 17535, 16219, 7838, 10685, 
12040, 19907, 13694, 6187, 16784, 21425, 18890, 24891, 16251, 
16977, 25206, 28573, 18704, 29178, 22069, 39687, 53734), AddToCart = c(279, 
4955, 5636, 8991, 15530, 18374, 9431, 5980, 4852, 5412, 4114, 
1782, 370, 3208, 6311, 9760, 7428, 6792, 3500, 5446, 1507, 783, 
2032, 833, 397, 2760, 5784, 9810, 13274, 14470), Registrations = c(194, 
3210, 3573, 6067, 10305, 12653, 6564, 3874, 3076, 3652, 2730, 
1227, 257, 2078, 4001, 6586, 4929, 4677, 2436, 3528, 955, 528, 
1348, 573, 276, 1788, 3667, 6620, 8808, 9964), ShippingDetails = c(134, 
2235, 2593, 4266, 7408, 9244, 4557, 2698, 2232, 2568, 1962, 896, 
178, 1447, 2904, 4631, 3543, 3417, 1691, 2457, 693, 371, 969, 
418, 191, 1245, 2661, 4655, 6332, 7280), Checkout = c(90, 1436, 
1792, 2864, 4672, 5666, 3078, 1734, 1543, 1724, 1237, 549, 120, 
930, 2007, 3109, 2234, 2094, 1142, 1579, 479, 249, 611, 256, 
129, 800, 1839, 3125, 3993, 4462), Transactions = c(59, 937, 
1192, 1819, 2602, 2926, 2039, 1132, 1026, 1095, 689, 283, 79, 
607, 1335, 1975, 1244, 1081, 756, 1031, 318, 158, 340, 132, 85, 
522, 1223, 1985, 2224, 2304)), class = "data.frame", row.names = c(NA, 
-30L), .Names = c("Channel", "Promo", "Sessions", "AddToCart", 
"Registrations", "ShippingDetails", "Checkout", "Transactions"
))

您需要确保您的陈述在{无论条件如何,都会返回 data.frame。所以你需要一个else ..

cond <- FALSE

mtcars %>% 
  group_by(cyl) %>% 
  { if (cond) filter(., am == 1) else . } %>% 
  summarise(m = mean(wt))

可以很好地配合TRUE or FALSE.

(另请注意,像这样的简单示例确实使问题更容易理解。)


通过 R 的原生管道,您可以使用这个有点尴尬的匿名函数:

mtcars |>
  group_by(cyl) |>
  (\(d) if (cond) filter(d, am == 1) else d)() |>
  summarise(m = mean(wt))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 if() 在 dplyr 管道链中使用 select() 的相关文章

  • R闪亮:在渲染表格时显示“正在加载...”消息

    在 Rstudio Shiny 中 我得到了一些renderDataTable通过 RMySQL 从数据库获取信息的调用 有些查询可能需要几秒钟才能完成 我想添加一条 正在加载 消息 其中表格将在等待时最终呈现 这个问题与这个问题类似 R闪
  • r 闪亮下载过滤数据表(DT)

    我正在尝试做一个shiny应用程序下载过滤后的Datatable 过滤与search 通过删除行进行过滤delete button 下载部分按预期工作 问题 当我第一次使用数据表中的搜索区域进行过滤时 如果我使用按钮删除一行 它会重置第一个
  • 使用服务器中的 Shiny Reactive 作为 UI 输入

    我正在努力使用反应函数的结果作为 UI 的输入 目前 我主要使用 renderUI 随着应用程序变得更加复杂 它会降低性能 Using DetailsList items filtered Accounts columns columns
  • 非等值连接 - 比较 R 中的两个数据帧

    我想根据第二个数据框中存在的值过滤数据框 例如 匹配第一个数据帧中 BP 列中高于 start pos 列的第一个值且小于 end pos 列或仅小于第二个数据中的 end pos 的行框架 我需要对第二个数据框中的所有值重复此过程 目前
  • data.table:j中的匿名函数

    我试图让匿名函数返回多列j的论证data table 这是一个例子 sample data tmpdt lt data table a c rep a 5 rep b 5 b c rep f 3 rep r 7 c 1 10 d 21 30
  • 一起使用 R6 类和 foreach() %dopar% 的问题

    当与 foreach 一起使用时 我在 R6 类上遇到问题 可能与环境有关 我使用的是 Windows 假设有两个 R6 类 class1 和 class2 class1 中的 method1 依赖于 class2 例如 请参见下面的示例代
  • R: pi[[j]] 中的错误:下标越界——数据帧列表上的 rbind

    我正在尝试重新绑定一个大的数据帧列表 outputDfList 它是通过将一个复杂的函数应用于一个大表而生成的 您可以通过以下方式重新创建outputDfList df1 data frame randomseq chr15q22 1 tr
  • 查询文本指定 use_legacy_sql:false,而 API 选项指定:true

    我将 standardSQL 与 bigrquery 一起使用 library bigrquery project lt sql lt standardSQL SELECT result lt query exec sql project
  • 如何在R中将plot转换为ggplot?

    我是 R 新手 我正在尝试将绘图转换为 ggplot plot res s type n main title print lines res s res s output 2014 02 14 51 8460 2014 02 14 44
  • R 中的插补 MICE 仍不存在于数据集中

    运行 MICE 包后 5 个完整插补集中的缺失值数量从 147428 减少到 46093 但不是应该是 0 NA 吗 Thanks 这是我的 MICR 代码 imp mice newdata imputationSet1 complete
  • 当我创建新变量时出了什么问题?

    我想根据原始变量施加的条件创建一个新变量 比方说 原始变量 var 是由 1 20 中的随机样本组成的向量 并且 当原来的 var 大于10时 新变量 newvar 被设置为缺失 当 var 小于10时 新变量 newvar 被设置为等于
  • 如何在Shiny中引用ui.R中的反应元素

    我正在使用 ShinyDND 包制作一个具有拖放功能的应用程序 我想将输入中的列表作为 DragSetUI 的参数传递 该函数需要在 ui R 中运行 我尝试了renderUI和uiOutput 它几乎可以工作 但是拖动的元素无法放置在放置
  • 条件 RenderUI R 闪亮

    我的 renderUI 有问题 但在任何地方都找不到解决方案 可能我向谷歌问了错误的问题 不仅仅是一个闪亮的问题 而是一个基本的 R 问题 我在 R 中有一个函数 根据输入将返回一个表格或文本 所以我在我的 server R 中以这种方式创
  • ggplot 中的分层轴?

    我想知道是否可以在 GGLPOT2 或其他图形包 我只是更喜欢 ggplot 中制作分层 分段轴 我想要做的是获取下面的数据 制作一个堆积条形图 其中 x 轴上有周期 但在每个周期内 还有每种动物 那么每只动物内的条形颜色将是 颜色 变量
  • 不同元素的ggplot字体大小

    我知道在创建 ggplot 图后我可以使用theme get 返回所有主题元素的详细信息 这对于弄清楚诸如此类的事情非常有帮助strip text x等等 但我有两件事无法弄清楚 1 在下面的ggplot图形中 代表短语 被土拨鼠卡住的木头
  • 在 RGUI 中自动保存 R 源

    是否可以告诉 RGui 自动保存 R 源代码 以便它们在系统崩溃时不会丢失 我非常怀念这个功能 因为我的系统时不时地崩溃 而且我不想仅仅因为需要这个功能而使用 R Studio 或其他一些 IDE 我喜欢 RGui 提供的简单性 None
  • 查找表中第三个四分位数以上的频率

    我有一个大数据框架 对 57 个变量的超过 239k 观察值 其中包含一些疾病描述以及针对不同年龄段的人针对这些疾病使用的药物 我想在每种疾病描述的使用频率前四分之一中找到这些药物 为了制作一个可重现的示例 我创建了一个包含 1000 个观
  • 在 R 中绘制决策树(插入符)

    我已经训练了一个数据集rf方法 例如 ctrl lt trainControl method LGOCV repeats 3 savePred TRUE verboseIter TRUE preProcOptions list thresh
  • selectInput 的动态数量

    我是闪亮的新手 所以这可能是一个非常基本的问题 我想编写一个闪亮的应用程序 其中用户输入 n 我们得到 n 个 selectInput 选项 但我无法做到这一点 基本上任何形式的 for 循环都不起作用 我尝试的代码如下 library s
  • rgdax(coinbase)数据未按预期收集数据

    我正在尝试使用rgdaxR 包用于下载一些历史价格 我设置了 API 密钥等 并尝试在过去 24 小时内加载 start lt strftime Sys time Y m dT H M SZ tz UTC end lt strftime S

随机推荐