我无法找到dplyr 0.7替换将被弃用的mutate_函数的方法.
该mutate_功能在我的使用情况是有用的:我存储在数据库(字符串格式)许多指令(即如果需要,可以过滤),并应用这些指令到一个或几个数据帧.
例如 :
dplyr::tibble(test = "test@test") %>%
dplyr::mutate_(.dots = list("test2" = "substr(test, 1, 5)",
"test3" = "substr(test, 5, 5)"))
Run Code Online (Sandbox Code Playgroud)
有没有办法用dplyr 0.7保存变量和指令作为字符?
我想将dplyr的编程魔术(新于0.7.0版)用于coalesce两列。在下面,我列出了一些尝试。
df <- data_frame(x = c(1, 2, NA), y = c(2, NA, 3))
# What I want to do:
mutate(df, y = coalesce(x, y))
# Here's the expected output:
#> # A tibble: 3 x 2
#> x y
#> <dbl> <dbl>
#> 1 1 1
#> 2 2 2
#> 3 NA 3
Run Code Online (Sandbox Code Playgroud)
我以为fn1可以用,但是它varname在右侧被视为角色。
fn1 <- function(varname) {
mutate(df, UQ(varname) := coalesce(x, !!varname))
}
fn1("y")
# Error in mutate_impl(.data, dots) : …Run Code Online (Sandbox Code Playgroud) 我希望我知道如何使这个例子更小,但我不能很好地理解这个问题.
我有一个包重写R函数使它们尾递归:tailr.它对递归函数进行了一些分析,然后将其转换为循环函数.例如,它将转换此阶乘函数
factorial <- function(n, acc) {
if (n <= 1) acc
else factorial(n - 1, acc * n)
}
Run Code Online (Sandbox Code Playgroud)
进入这个版本
factorial <- function(n, acc) {
.tailr_n <- n
.tailr_acc <- acc
callCC(function(escape) {
repeat {
n <- .tailr_n
acc <- .tailr_acc
if (n <= 1)
escape(acc)
else {
.tailr_n <<- n - 1
.tailr_acc <<- acc * n
}
}
})
}
Run Code Online (Sandbox Code Playgroud)
生成的函数并不漂亮,但确实有效.
我的问题是如果我编写一个使用转换的包,只包含R的这些行:
#' Computes the factorial.
#' @param n A number
#' @param acc Accumulator …Run Code Online (Sandbox Code Playgroud) 我有一个自定义函数,我正在从数据框中读取输入的变量rlang.无论输入的参数是引用还是不引用,此函数都可以正常工作.但是,奇怪的是,当使用此函数时purrr::pmap,它仅在引用参数时起作用.
所以我有两个问题:
为什么函数行为这样?
如何使用rlang这样一个函数,即使用于我也不必引用参数purrr::pmap?
这是一个使用简单函数突出显示此问题的最小代表:
# loading the needed libraries
library(rlang)
library(dplyr)
library(purrr)
# defining the function
tryfn <- function(data, x, y) {
data <-
dplyr::select(
.data = data,
x = !!rlang::enquo(x),
y = !!rlang::enquo(y)
)
# creating a dataframe of means
result_df <- data.frame(mean.x = mean(data$x), mean.y = mean(data$y))
# return the dataframe
return(result_df)
}
# without quotes (works!)
tryfn(iris, Sepal.Length, Sepal.Width)
#> mean.x mean.y
#> 1 5.843333 3.057333 …Run Code Online (Sandbox Code Playgroud) 我有一个函数x_expression()打印传递给参数的表达式x.
pacman::p_load(magrittr, rlang)
x_expression <- function(x) {
print(enquo(x))
}
y <- 1
x_expression(y)
#> <quosure>
#> expr: ^y
#> env: global
y %>% x_expression()
#> <quosure>
#> expr: ^.
#> env: 0x7ff27c36a610
Run Code Online (Sandbox Code Playgroud)
所以你可以看到它知道y传递给它,但是当y管道输入时%>%,该函数返回打印..有没有办法y在它被管道输入的情况下恢复它,或者它是否永远消失了?简而言之,我想要的是一个类似于上面两种情况的x_expression()打印功能y.
这个问题确实类似于在R中通过管道传递的数据帧的获取名称,但它稍微更一般.这个人只想要数据框的名称,我想要表达式,无论它是什么.但是,相同的答案可能适用于两者.我不喜欢这个近似重复的问题的答案,答案的作者也不喜欢.
我已经查看了其他答案,但找不到下面代码的解决方案.基本上,我正在创建一个函数,inner_join即两个数据框并filter基于函数中输入的列.
问题是filter函数的一部分不起作用.但是,如果我将函数过滤掉并将其追加,它就可以工作mydiff("a") %>% filter(a.x != a.y)
任何建议都有帮助.
请注意,我是引号中的函数输入
library(dplyr)
# fake data
df1<- tibble(id = seq(4,19,2),
a = c("a","b","c","d","e","f","g","h"),
b = c(rep("foo",3), rep("bar",5)))
df2<- tibble(id = seq(10, 20, 1),
a = c("d","a", "e","f","k","m","g","i","h", "a", "b"),
b = c(rep("bar", 7), rep("foo",4)))
# What I am trying to do
dplyr::inner_join(df1, df2, by = "id") %>% select(id, b.x, b.y) %>% filter(b.x!=b.y)
#> # A tibble: 1 x 3
#> id b.x b.y
#> <dbl> <chr> …Run Code Online (Sandbox Code Playgroud) 我正在尝试安装 的开发版本tidyr。当我尝试devtools::install_github("tidyverse/tidyr")或 时remotes::install_github("tidyverse/tidyr"),出现以下错误:
> devtools::install_github("tidyverse/tidyr")\nDownloading GitHub repo tidyverse/tidyr@master\nDownloading GitHub repo r-lib/vctrs@master\nThese packages have more recent versions available.\nWhich would you like to update?\n\n1: All\n2: CRAN packages only\n3: None\n4: rlang (0.3.4 -> 18856f22a...) [GitHub]\n5: ellipsis (0.1.0 -> 9908b24a2...) [GitHub]\n\nEnter one or more numbers separated by spaces, or an empty line to cancel\n1: 1\nrlang (0.3.4 -> 18856f22a...) [GitHub]\nellipsis (0.1.0 -> 9908b24a2...) [GitHub]\nDownloading GitHub repo r-lib/rlang@master\n\xe2\x88\x9a checking for file \'C:\\Users\\owner\\AppData\\Local\\Temp\\RtmpYDrYNh\\remotes96bc1c295445\\r-lib-rlang-18856f2/DESCRIPTION\' ...\n- preparing \'rlang\': (2s)\n\xe2\x88\x9a checking DESCRIPTION meta-information …Run Code Online (Sandbox Code Playgroud) 有人可以解释一下,我们需要什么!!,!!!或者{{}}需要什么操作员吗rlang?我试图了解更多有关准引用的知识,但没有得到任何结果。
我已经在 Stack 上找到了几篇关于 curly-curly 运算符的帖子,并且了解我们{{在将数据帧的变量(或对象的其他子对象)传递到函数中时使用它。但在阅读了有关引用/取消引用的内容后,我对所有这些运算符及其用法完全感到困惑。
为什么我们需要它,为什么有些函数没有它就无法读取参数,最后,它们实际上是如何工作的?
如果您以最简单的方式给出答案,即使我也能理解(也许有例子?),我将不胜感激。
我正在一个长数据库(full_database)上运行一个函数,该数据库有两个主要组,我需要在每个组的多个子集上执行各种线性模型。
然后,我将 R^2、调整后的 R^2 和 p.value 提取到数据框中,其中每一行对应于一次比较。由于有 30 种不同的情况,我有另一个小标题,其中列出了函数参数所在的所有可能性( possibility )。
原始函数的脚本是:
database_correlation <- function(id, group) {
require(dplyr)
require(tidyr)
require(rlang)
id_name <- quo_name(id)
id_var <- enquo(id)
group_name <- quo_name(group)
group_var <- enquo(group)
corr_db <- full_database %>%
filter(numid==!!id_name) %>%
filter(major_group==!!group_name) %>%
droplevels()
correlation <- summary(lm(yvar~xvar, corr_db))
id.x <- as.character(!!id_var) #Gives out an error: "invalid argument type"
group.x <- as.character(!!group_var) #Gives out an error: "invalid argument type"
r_squared <- correlation$r.squared
r_squared_adj <- correlation$adj.r.squared
p_value <- correlation$coefficients[2,4]
data.frame(id.x, group.x, r_squared, r_squared_adj, …Run Code Online (Sandbox Code Playgroud) 我的问题与this 问题类似,但我需要跨列应用更复杂的函数,并且我不知道如何将 Lionel 建议的解决方案应用到具有作用域动词 likefilter_at()或filter()+across()等价物的自定义函数。{{{}}}看起来并没有引入“superstache”/运算符。
这是我想要做的一个非编程示例(不使用 NSE):
library(dplyr)
library(magrittr)
foo <- tibble(group = c(1,1,2,2,3,3),
a = c(1,1,0,1,2,2),
b = c(1,1,2,2,0,1))
foo %>%
group_by(group) %>%
filter_at(vars(a,b), any_vars(n_distinct(.) != 1)) %>%
ungroup
#> # A tibble: 4 x 3
#> group a b
#> <dbl> <dbl> <dbl>
#> 1 2 0 2
#> 2 2 1 2
#> 3 3 2 0
#> 4 3 2 1
Run Code Online (Sandbox Code Playgroud)
我还没有找到filter_at与filter+相同的行across() …