- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解 tidyverse 设计以及如何使用它进行编程有一段时间了。我试图编写一个使用 tidyselect 语义的函数,我发现 tidyselect::eval_select
将数字附加到 lhs 表达式。看到这个语义用于列重命名,这并不奇怪。不幸的是,我用于构建数据结构的函数不需要这种行为,它需要表达式的 lhs 中提供的常规名称(根据需要重复多次)。我还没有设法找出这种行为的来源;好像是 make.unique
但我找不到它在哪里实现。如果你知道,我很想学习,如果没有,解决我的问题不应该依赖于它。
我想要的只是 lhs 名称没有附加数字,如示例所示:
library(tidyverse)
# Data
data <- mtcars[, 8:11]
# Example
data %>%
tidyselect::eval_select(rlang::expr(c(foo = 1, bar = c(2:4), foobar = c(1, "am", "gear", "carb"))), .)
#> foo bar1 bar2 bar3 foobar1 foobar2 foobar3 foobar4
#> 1 2 3 4 1 2 3 4
# Function
test <- function(.data, ...) {
loc <- tidyselect::eval_select(rlang::expr(c(...)), .data)
names <- names(.data)
list(names(loc), names[loc])
}
data %>%
test(foo = 1, bar = c(2:4), foobar = c(1, "am", "gear", "carb"))
#> [[1]]
#> [1] "foo" "bar1" "bar2" "bar3" "foobar1" "foobar2" "foobar3"
#> [8] "foobar4"
#>
#> [[2]]
#> [1] "vs" "am" "gear" "carb" "vs" "am" "gear" "carb"
创建于 2021-05-22 由
reprex package (v2.0.0)
#> [[1]]
#> [1] "foo" "bar" "bar" "bar" "foobar" "foobar" "foobar"
#> [8] "foobar"
#>
#> [[2]]
#> [1] "vs" "am" "gear" "carb" "vs" "am" "gear" "carb"
任何帮助是极大的赞赏。
最佳答案
该问题是由名为 ensure_named
的函数引起的。深深嵌套在里面 eval_select
l 实现。它是 vars_select_eval
的一部分功能。ensure_named(pos, vars, uniquely_named, allow_rename)
好消息是我们只需要覆盖 uniquely_named
参数,这个参数是从第一个名为 eval_select_impl
的实现函数开始的。由 eval_select
调用本身。所以我们需要做的就是重写tidyselect::eval_select
.
为了获得想要的输出,我们需要做两件事:
uniquely_named = NULL
作为参数并用 FALSE
指定它调用函数时 name_spec = "{outer}"
.除非 uniquely_named
只做这一步是不够的设置为 FALSE
. tidyselect::eval_select
故意不允许重复的列名。
tibble
是不可能的。列名重复:
tibble(a = 1:3, b = 4:6, a = 7:9)
#> Error: Column name `a` must not be duplicated.
#> Use .name_repair to specify repair.
一种解决方法是使用带有
tibble::new_tibble
的列表。 :
tibble::new_tibble(list(a = 1:3, b = 4:6, a = 7:9), nrow = 3)
#> # A tibble: 3 x 3
#> a b a
#> <int> <int> <int>
#> 1 1 4 7
#> 2 2 5 8
#> 3 3 6 9
对于
data.frame
当
check.names
时,只能创建非唯一名称。参数设置为
FALSE
:
data.frame(a = 1:3, b = 4:6, a = 7:9, check.names = FALSE)
#> a b a
#> 1 1 4 7
#> 2 2 5 8
#> 3 3 6 9
但是当我们使用这个
data.frame
使用常规的 {dplyr} 动词,会抛出错误,告诉我们不能转换具有重复名称的数据框:
data.frame(a = 1:3, b = 4:6, a = 7:9, check.names = FALSE) %>%
mutate(c = 1:3)
#> Error: Can't transform a data frame with duplicate names.
所以由此我们可以假设不推荐使用
data.frame
在 {tidyverse} 中具有重复名称的 s。它可能与整洁数据的概念相矛盾。
library(tidyverse)
# Data
data <- mtcars[, 8:11]
# custom eval_select function
my_eval_select <- function(expr, data,
env = rlang::caller_env(),
..., include = NULL,
exclude = NULL, strict = TRUE,
name_spec = NULL,
uniquely_named = NULL, # this is the new argument
allow_rename = TRUE) {
ellipsis::check_dots_empty()
tidyselect:::eval_select_impl(data, names(data), rlang::as_quosure(expr, env),
include = include, exclude = exclude, strict = strict,
name_spec = name_spec, allow_rename = allow_rename,
uniquely_named = uniquely_named) # which we also add here
}
# example 1
data %>%
my_eval_select(rlang::expr(c(foo = 1, bar = c(2:4), foobar = c(1, "am", "gear", "carb"))),
data = .,
name_spec = "{outer}", # we need to specify this
uniquely_named = FALSE) # and this
#> foo bar bar bar foobar foobar foobar foobar
#> 1 2 3 4 1 2 3 4
# example: custom function
test <- function(.data, ...) {
loc <- my_eval_select(rlang::expr(c(...)),
data = .data,
name_spec = "{outer}",
uniquely_named = FALSE)
names <- names(.data)
list(names(loc), names[loc])
}
# test
data %>%
test(foo = 1, bar = c(2:4), foobar = c(1, "am", "gear", "carb"))
#> [[1]]
#> [1] "foo" "bar" "bar" "bar" "foobar" "foobar" "foobar" "foobar"
#>
#> [[2]]
#> [1] "vs" "am" "gear" "carb" "vs" "am" "gear" "carb"
创建于 2021-05-22 由
reprex package (v0.3.0)
关于R:Tidyverse 选择语义 tidyselect::eval_select 将数字附加到重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67649636/
我正在尝试安装 tidyverse 包以便在我的脚本中使用 gather 函数。每次我尝试安装软件包时都会收到以下消息: * installing *source* package ‘curl’ ..
当我加载tidyVerse时,我收到以下错误。几分钟前,当我运行我的shinyapp时,一切都很好。我该如何解决这个问题呢?
没有名为“tidyverse”的包是我在执行此操作后收到的错误消息: install.packages('tidyverse', dependencies = T); install.packages
我想在不重复的数据帧行之间创建所有可能的对(即 A_B 与 B_A 相同)。 在 tidyverse 中是否有一种优雅的方式来做到这一点? 示例数据: df df_pairs # A tibble:
我想加入两个数据框,我需要将“by”列作为动态列传递。我试图在此处遵循此解决方案 ( How to pass column names for inner join by 2 column sets
我正在尝试编写一些代码来检查字符串是否包含术语列表中包含的任何单词,以便在数据框中创建一个新列。 这是术语列表: vehicles % mutate( asset_type = case_
我有以下数据框: dat % rowwise() %>% mutate(my_ranks = list(rank(c_across(starts_with("x"))))) 但是当我尝试取消嵌
我有一个包含多个变量的数据集,其中两个是日期(开始日期、结束日期)。有时日期间隔已被拆分为序列,例如,您将: 开始:1990-12-12,停止:1990-12-13开始:1990-12-13,停止:1
我正在尝试在 R 中进行库存计算,这需要对每个 Mat-Plant 组合进行逐行计算。这是一个测试数据集 - df 300K 行,所以希望用 tidyverse 做到这一点以获得更优雅和更快的方法。尝
我有我想与我只有开始日期的事件匹配的日期。作为一个简化的代表,假设我想弄清楚在某些事件中谁是总统,但我只有就职日期。 pres % left_join(pres, by = c("date
我想创建具有中间函数的 tidyverse。我有一个结构 temp1 = sapply(df, function(x) .....) temp2 = sapply(temp1, function(x)
是否可以relocate 行 在 tidyverse框架就像可以用于带有 dplyr 的列一样relocate ? 在这个例子中,我想将第 1 行重新定位到位置 5(数据帧的结尾) 我的数据框: df
我想知道是否有人知道 dplyr 扩展包( dbplyr 和 dtplyr )是否允许在通常的 dplyr 工作流程中进行非对等连接?我很少需要 data.table ,但快速非 equi 连接是我总
我想在分组后汇总时,计算另一个因素的特定级别的数量。 在下面的工作示例中,我想计算每个组中 "male" 级别的数量。我已经尝试了很多计数、计数等方法,但找不到一种简单明了的方法来做到这一点。 df
我有一个数据框,其中包含如下所示的数据: df % group_by(group1,group2,one) %>% summarise(n()).有什么方法可以汇总所有三列,然后将它们全部绑定(bin
当涉及到输出表格时,我正在将统计分析脚本从 SPSS 转换为 R,尽管我不断遇到问题。我最近开始使用 tidyverse 包,因此理想情况下希望找到一个与之兼容的解决方案,但更一般地说,我希望能够针对
我想以编程方式rename() 我的data 中的一些变量,这样我就可以在某个时候通过map 访问它。 我正在寻找等同于, library(tidyverse) mtcars %>% rename(
使用examples从 Wickhams 对 R for data science 的 purrr 的介绍中,我正在尝试创建一个双重嵌套列表。 library(gapminder) library(p
我有一些每周收集的数据,其中的一个片段是这样的,通过 dput: p % gather(time,value,railroad, measure, category) %>%
我有数据,我想使用 tidyverse 方法获取多列的一堆汇总统计信息。但是,利用 tidyverse 的 summarize函数,它会将每个列统计信息创建为一个新列,而我更愿意将列名称视为行,将每个
我是一名优秀的程序员,十分优秀!