问题标签 [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.

0 投票
2 回答
226 浏览

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_colcoalesce(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_colcoalesce(all_of(starts_with("col")))

底线

我如何编写一个自定义函数coalesce(),它将接收一个数据对象和特定的列名来合并,允许特定的命名(例如)c(col_a, col_b, col_c)和辅助函数(例如,starts_with("col")在函数的vars参数中)?

0 投票
1 回答
50 浏览

r - 如何协调 .data 代词与 rlang::enquo

我正在使用很多dplyr功能编写一个包 - 要通过所有测试devtools::check(),我必须.data经常使用。一些函数嵌套在其他函数中。在下面的示例中,我需要variabletidyselect上下文和标准评估中使用(在创建id).

如果没有在 CMD 检查中收到任何警告或注释,我不知道如何处理这个问题。如果我运行,该功能有效 test(df = df, variable = V1),但不适用于test(df = df, variable = .data$V1)

0 投票
2 回答
32 浏览

r - 从匹配正则表达式的第一列开始删除列范围

我有以下数据框,它是read_excelexcel 中缺少列名的输出:

如何以灵活的动态方式选择列..3Z不取决于数字或表格宽度)。我正在考虑类似的方向:

但这会发出警告,因为starts_with返回两个值。

0 投票
0 回答
171 浏览

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) 来检查是否没有屏蔽任何功能。知道我做错了什么吗?

0 投票
2 回答
462 浏览

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 }}), ...)的函数中起作用。

0 投票
1 回答
174 浏览

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) 毫无问题地运行,所以它确实存在。我究竟做错了什么?

示例数据:

0 投票
0 回答
380 浏览

r - 找不到签名“tbl_df”的函数“坐标”的继承方法

0 投票
1 回答
84 浏览

r - 在自定义 dplyr 包装函数中使用带引号的变量

我的问题如下。我有一个foo在里面工作的函数dplyr::mutate。此函数接受tidyselect语法。我想构建一个bar也应该支持tidyselect语法的包装函数。我正在寻找一种干净的方式将tidyselected 列从barto 传递给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 创建

0 投票
1 回答
226 浏览

r - 删除R中多个变量中的字符串

这是我的数据的 MWE,我想从包含“Med”的所有列中删除字符串“NaN”

我尝试了以下方法:

我也有从单个列中删除字符串的问题,所以我想我可能会误解str_remove

0 投票
2 回答
121 浏览

r - R:Tidyverse 选择语义 tidyselect::eval_select 将数字附加到重复项

我正在尝试一段时间来了解 tidyverse 设计以及如何使用它进行编程。我试图编写一个使用 tidyselect 语义的函数,我发现它将tidyselect::eval_select数字附加到 lhs 表达式。看到此语义用于列重命名也就不足为奇了。不幸的是,我用于构建数据结构的函数不需要这种行为,它需要表达式的 lhs 中提供的常规名称(根据需要重复多次)。我还没有设法找出这种行为的来源。它似乎是一个make.unique,但我找不到它的实施位置。如果你知道,我很想知道,如果没有,解决我的问题不应该依赖它。我想要的只是 lhs 名称没有附加数字,如示例中所示:

reprex 包于 2021-05-22 创建 (v2.0.0 )

期望的输出:

任何帮助是极大的赞赏。