问题标签 [tidyselect]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - 编写自定义函数时将列名传递给 dplyr::coalesce()
我正在尝试编写一个将 wrap 的函数,dplyr::coalesce()
并将接收数据对象和列名以合并。到目前为止,我的尝试都失败了。
示例数据
在编写自定义函数时使用存根
结果...
coalesce_plus_1()
错误:找不到对象“col_a”。
然而:
coalesce_plus_2()
lapply(.x, .f, ...) 中的错误:找不到对象“col_a”
并且
错误:
starts_with()
必须在选择函数中使用。我参见https://tidyselect.r-lib.org/reference/faq-selection-context.html。运行rlang::last_error()
以查看错误发生的位置。
coalesce_plus_3()
错误:
mutate()
输入有问题coalesced_col
。x 输入coalesced_col
不能被回收到大小 5。 i 输入coalesced_col
是coalesce(c(col_a, col_b, col_c))
. i 输入coalesced_col
的大小必须为 5 或 1,而不是 15。
并且
错误:
mutate()
输入有问题coalesced_col
。xstarts_with()
必须在选择函数中使用。我参见https://tidyselect.r-lib.org/reference/faq-selection-context.html。i 输入coalesced_col
是coalesce(all_of(starts_with("col")))
。
底线
我如何编写一个自定义函数coalesce()
,它将接收一个数据对象和特定的列名来合并,允许特定的命名(例如)c(col_a, col_b, col_c)
和辅助函数(例如,starts_with("col")
在函数的vars
参数中)?
r - 如何协调 .data 代词与 rlang::enquo
我正在使用很多dplyr
功能编写一个包 - 要通过所有测试devtools::check()
,我必须.data
经常使用。一些函数嵌套在其他函数中。在下面的示例中,我需要variable
在tidyselect
上下文和标准评估中使用(在创建id)
.
如果没有在 CMD 检查中收到任何警告或注释,我不知道如何处理这个问题。如果我运行,该功能有效 test(df = df, variable = V1)
,但不适用于test(df = df, variable = .data$V1)
r - 从匹配正则表达式的第一列开始删除列范围
我有以下数据框,它是read_excel
excel 中缺少列名的输出:
如何以灵活的动态方式选择列..3
(Z
不取决于数字或表格宽度)。我正在考虑类似的方向:
但这会发出警告,因为starts_with
返回两个值。
r - 为什么 pivot_longer() 仅在我在括号内指定数据框时才起作用,而不是使用管道符号?
我试图使用数据框 %>% pivot_longer( ) 重新排列数据框,但会不断出错,但是我尝试指定 cols 参数。
例如,尝试 cols = (!colname) 我会得到:错误:没有适用于“pivot_longer”的方法应用于“逻辑”类的对象此外:“!” 对因子没有意义
使用 starts_with("string") 我会得到:错误:starts_with()
必须在选择函数中使用。
(即使帮助页面上给出的使用 'starts_with()' 的示例给出了“tidyr::pivot_longer() 的 cols 参数”作为应该使用它的示例!)
并尝试 cols = c(2:18) 给了我:没有适用于 'pivot_longer' 的方法应用于类 "c('integer', 'numeric')
但是,将数据框的名称作为括号内的第一个参数似乎已经解决了这个问题。我完全不解。我已经尝试过 library(tidyr) 来检查是否没有屏蔽任何功能。知道我做错了什么吗?
r - 使用 dplyr 编程:使用胶水语法重命名带有变量的列
我已经通读了Programming with dplyr并理解了这一点rename()
并select()
使用了整洁的选择。我正在尝试将其与胶合语法结合使用新的双花括号语法(rlang v0.4.0)创建自定义函数,但是我得到了额外的引号:
由reprex 包(v0.3.0)于 2021-02-16 创建
`"homeworld"_old`
在使用双花{{ }}
胶和胶水:=
语法时,如何避免多余的引号?这显示在此处summarise("mean_{{expr}}" := mean({{ expr }}), ...)
的函数中起作用。
r - tidyselect::where() 不一致:where() 在哪里?
总结:你可以做rename(A=1, B=2),你能用rename_with()做同样的事情吗?我的 ~str_replace(... paste0()) 有效,我不需要改变它。但它一次只适用于一个变量。Tidyselect 建议包装 where(~str_replace...) 但随后抱怨它找不到它,即使我可以让 where() 在其他情况下工作。
我想为多个变量实现 rename_with,但我得到一个错误Error: Formula shorthand must be wrapped in
where()`。
示例原文:
test%>% rename_with( ~str_replace(., "Var_2_", paste0("Issue: Time")), ~str_replace(., "Var_3_", paste0("Issue: Time")))
当我跑步时
test%>% rename_with(where( ~str_replace(., "Var_2_", paste0("Issue: Time")), ~str_replace(., "Var_3_", paste0("Issue: Time"))))
和
test%>% rename_with( where(~str_replace(., "Var_2_", paste0("Issue: Time"))), where(~str_replace(., "Var_3_", paste0("Issue: Time"))))
我明白
Error in where(~str_replace(., "Var_1_", paste0("Gov't surveillance: video wave")), : could not find function "where"
了,我找不到它通过tidyselect::
但我可以
test%>% select(where(is.numeric)) %>% map(sd, na.rm = TRUE)
毫无问题地运行,所以它确实存在。我究竟做错了什么?
示例数据:
r - 在自定义 dplyr 包装函数中使用带引号的变量
我的问题如下。我有一个foo
在里面工作的函数dplyr::mutate
。此函数接受tidyselect
语法。我想构建一个bar
也应该支持tidyselect
语法的包装函数。我正在寻找一种干净的方式将tidyselect
ed 列从bar
to 传递给foo
. 听起来很容易,但问题是foo
需要接受将被引用的裸用户输入,并且还需要接受来自包装函数的已引用列。
那么让我们来看看这个问题:
由reprex 包(v0.3.0)于 2021-04-14 创建
上述方法不起作用是完全有道理的。对我来说,如何以干净一致的方式处理这个问题并不明显。
下面我展示了我尝试过的方法以及我想出了什么样的平庸解决方法。
我认为我可以做的是:检查列是否已被引用,如果没有enquote
。然而,这似乎是不可能的。一旦未引用的列用于任何类型的操作,它们将被评估和更改。必须作为第一enquo
件事发生。但如果它首先发生,我无法检查它们是否已经被引用。
由reprex 包(v0.3.0)于 2021-04-14 创建
目前我正在使用一种我不太喜欢的解决方法。我使用省略号...
,foo
以便可以使用不需要记录的附加参数调用它。现在foo
可以用flag
参数调用,在这种情况下foo
知道不必引用列。
但是,我认为这不是一个干净的解决方案。我更喜欢某种在未引用时引用的函数,或者在将列名传递给时恢复列名环境的函数bar
。
另一种可能的解决方案是首先评估其中的列,bar
然后将列名称作为字符串粘贴到foo
. 我没有尝试过,它应该可以工作,因为 tidyselect 接受字符串,但是我想避免评估列名,bar
因为它看起来不是很有性能。
欢迎任何其他想法。
由reprex 包(v0.3.0)于 2021-04-14 创建
r - 删除R中多个变量中的字符串
这是我的数据的 MWE,我想从包含“Med”的所有列中删除字符串“NaN”
我尝试了以下方法:
我也有从单个列中删除字符串的问题,所以我想我可能会误解str_remove
r - R:Tidyverse 选择语义 tidyselect::eval_select 将数字附加到重复项
我正在尝试一段时间来了解 tidyverse 设计以及如何使用它进行编程。我试图编写一个使用 tidyselect 语义的函数,我发现它将tidyselect::eval_select
数字附加到 lhs 表达式。看到此语义用于列重命名也就不足为奇了。不幸的是,我用于构建数据结构的函数不需要这种行为,它需要表达式的 lhs 中提供的常规名称(根据需要重复多次)。我还没有设法找出这种行为的来源。它似乎是一个make.unique
,但我找不到它的实施位置。如果你知道,我很想知道,如果没有,解决我的问题不应该依赖它。我想要的只是 lhs 名称没有附加数字,如示例中所示:
由reprex 包于 2021-05-22 创建 (v2.0.0 )
期望的输出:
任何帮助是极大的赞赏。