- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
经过大量的反复试验和咨询以前的答案,例如 How to detect if bare variable or string我想我自己已经完成了大部分我需要做的事情。但是我很想知道在我将“解决方案”投入生产之前,我是否做出了一些错误的假设或愚蠢地解决了问题。
考虑以下数据:
library(dplyr)
library(purrr)
library(tidyselect)
set.seed(1111)
dat1 <- data.frame(Region = rep(c("r1","r2"), each = 100),
State = rep(c("NY","MA","FL","GA"), each = 10),
Loc = rep(c("a","b","c","d","e","f","g","h"),each = 5),
ID = rep(c(1:10), each = 2),
var1 = rnorm(200),
var2 = rnorm(200),
var3 = rnorm(200),
var4 = rnorm(200),
var5 = rnorm(200))
tidied
aov
结果返回单个案例
var1 ~ State
或使用
map2
匹配一对列表一个列表包含“结果”,另一个“预测器”。它们从使用到使用永远不会相同,并且与我的示例不同,变量很少适用于像
starts_with
这样的简单解决方案。 .
map2
的功能时,我找到了很多解决方案但只有这个似乎适用于 map2。看起来如此复杂,我无法相信这是一个不错的选择......(再次在代码中注释以显示位置)
tidyselect::all_of
因为这些可能是含糊不清的列表,为什么我还要提防
.x
和
.y
被视为调用而不仅仅是迭代标记?
MyFunction <- function(data,
groupvar,
var) {
# Issue #1 is this best way to warn/stop user?
lst <- as.list(match.call())
if (is.symbol(lst$groupvar) || is.symbol(lst$var)) {
stop("Please quote all variables")
}
# Issue #2 I want the group label but if I don't include
# this if logic it errors with " Error: Can't convert a call to a string"
# when I run it with purrr::map2
if (!is.call(groupvar)) {
grouplabel <- rlang::as_name(rlang::enquo(groupvar))
}
data <-
dplyr::select(
.data = data,
var = {{ var }},
groupvar = {{ groupvar }}
)
aov_object <- aov(var ~ groupvar, data = data)
aov_results <- broom::tidy(aov_object) %>%
mutate(term = if_else(term != "Residuals", grouplabel, term))
return(aov_results)
}
# Expected output
MyFunction(data = dat1, groupvar = "State", var = "var1") # works
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 State 3 1.75 0.582 0.485 0.693
#> 2 Residuals 196 235. 1.20 NA NA
MyFunction(data = dat1, groupvar = State, var = var1) # warns appropriately
#> Error in MyFunction(data = dat1, groupvar = State, var = var1): Please quote all variables
# Quick test of `map2`
grouping_vars <- names(dat1[,1:3])
names(grouping_vars) <- names(dat1[,1:3])
outcome_vars <- names(dat1[,5:7])
names(outcome_vars) <- names(dat1[,5:7])
names(outcome_vars) <- paste(outcome_vars, "~", grouping_vars)
# get multiple results this is where issue #2 comes in but this is what I want it to look like.
map2(.x = outcome_vars,
.y = grouping_vars,
.f = ~ MyFunction(dat = dat1,
var = tidyselect::all_of(.x),
groupvar = tidyselect::all_of(.y)))
#> $`var1 ~ Region`
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Region 1 0.0512 0.0512 0.0427 0.836
#> 2 Residuals 198 237. 1.20 NA NA
#>
#> $`var2 ~ State`
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 State 3 5.05 1.68 2.07 0.106
#> 2 Residuals 196 159. 0.814 NA NA
#>
#> $`var3 ~ Loc`
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Loc 7 5.09 0.727 0.772 0.612
#> 2 Residuals 192 181. 0.943 NA NA
最佳答案
在我看来,由于您坚持将字符串作为变量名传递,因此使用 as.formula
更改公式以匹配变量会更简单、更有效。而不是改变数据。这也可以防止您必须在函数内单独命名分组变量。
以下函数在基准测试中比原始函数更短,速度大约是原始函数的两倍,但行为保持不变:
MyFunctionNew <- function(data, groupvar, var)
{
lst <- as.list(match.call())
if (is.symbol(lst$groupvar) || is.symbol(lst$var))
stop("Please quote all variables")
broom::tidy(aov(as.formula(paste(var, "~", groupvar)), data = data)) %>%
mutate(term = if_else(term != "Residuals", groupvar, term))
}
map2
里面还是有效的:
map2(.x = outcome_vars,
.y = grouping_vars,
.f = ~ MyFunctionNew(dat = dat1,
var = tidyselect::all_of(.x),
groupvar = tidyselect::all_of(.y)))
#> $`var1 ~ Region`
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Region 1 0.0512 0.0512 0.0427 0.836
#> 2 Residuals 198 237. 1.20 NA NA
#>
#> $`var2 ~ State`
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 State 3 5.05 1.68 2.07 0.106
#> 2 Residuals 196 159. 0.814 NA NA
#>
#> $`var3 ~ Loc`
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Loc 7 5.09 0.727 0.772 0.612
#> 2 Residuals 192 181. 0.943 NA NA
MyVar <- "State"
MyFunction(data = dat1, groupvar = MyVar, var = "var1")
*apply
中工作。职能:
lapply(c("State", "Region", "ID"), function(x) MyFunction(dat1, x, "var1"))
#> Error in MyFunction(dat1, x, "var1") : Please quote all variables
MyFunction <- function(data, groupvar, var)
{
broom::tidy(aov(as.formula(paste(var, "~", groupvar)), data = data)) %>%
mutate(term = if_else(term != "Residuals", groupvar, term))
}
MyFunction(data = dat1, groupvar = "State", var = "var1")
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 State 3 1.75 0.582 0.485 0.693
#> 2 Residuals 196 235. 1.20 NA NA
MyFunction(data = dat1, groupvar = MyVar, var = "var1")
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 State 3 1.75 0.582 0.485 0.693
#> 2 Residuals 196 235. 1.20 NA NA
MyFunction(data = dat1, groupvar = State, var = var1)
#> Error in paste(var, "~", groupvar) : object 'State' not found
tryCatch
中。将“符号未找到错误”转换为“请使用引号”错误。
关于r - purrr + dplyr NSE 问题在用户编写的函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62091090/
我有以下数据框: library(dplyr) df % rename_all(funs(stringr::str_replace_all(., "gh", "v"))) 我想结合使用 renam
我有以下数据框: library(dplyr) df % rename_all(funs(stringr::str_replace_all(., "gh", "v"))) 我想结合使用 renam
我有一个数据( df_1 ): df_1 % select_at(.vars = 'var_1') var_1 1 99.47262 10 25.91552 没关系。但: df_1
我正在尝试安装dplyr软件包,但收到一条错误消息,提示“库(dplyr)中存在错误:没有名为dplyr的软件包”。我正在使用窗口系统和Ri386 3.5.2。我尝试按照其他人的建议使用代码insta
假设我想以并行方式申请 myfunction到 myDataFrame 的每一行.假设 otherDataFrame是一个包含两列的数据框:COLUNM1_odf和 COLUMN2_odf出于某些原因
我目前正在构建一个包,我想知道是否有办法调用 %>%来自 dplyr 的操作符,而无需实际附加 dplyr 包。例如,对于从包中导出的任何函数,您可以使用双冒号 ( :: ) 调用它。所以如果我想使用
library(dplyr) mtcars %>% group_by(vs) %>% do(tt=t.test(mpg~am, data=.)) %>% mutate(t=tt$statist
我正在尝试为一组标准曲线构建一系列线性模型。 目前这段代码正在产生我想要的输出(每个线性模型的截距和斜率): slopes % group_by(plate, col, row, conc_ug_mL
我正在寻找替换我的一些使用 dplyr::do 的 R 代码,因为这个函数很快就会被弃用。我的很多工作都需要创建分层 CDF 图。使用 dply:do 时,我分层的变量作为变量传递给结果数据框,然后我
问题 我正在尝试使用 dplyr::mutate()和 dplyr::case_when()在数据框中创建新的数据列,该列使用存储在另一个对象(“查找列表”)中的数据填充,并基于数据框中列中的信息。
最近我发现了很棒的 dplyr.spark.hive启用 dplyr 的软件包前端操作 spark或 hive后端。 在包的 README 中有关于如何安装此包的信息: options(repos =
我正在尝试在 dplyr 链中使用 data.frame 两次。这是一个给出错误的简单示例 df % group_by(Type) %>% summarize(X=n()) %>% mu
当我浏览答案时 here , 我找到了 this solution与 data.frame 完全符合预期. library(dplyr) # dplyr_0.4.3 library(data.tab
我的数据来自一个数据库,根据我运行 SQL 查询的时间,该数据库可能包含一周到另一周不同的 POS 值。 不知道哪些值将在变量中使得自动创建报告变得非常困难。 我的数据如下所示: sample % p
我想定义与“扫帚”包中类似的功能 library(dplyr) library(broom) mtcars %>% group_by(am) %>% do(model = lm(mpg ~ w
set.seed(123) df % group_by(id) %>% mutate(roll.sum = c(x[1:4], zoo::rollapply(x, 5, sum))) # Groups
先来个样本数据 set.seed(123) dat 1 -4 2 6 3 -2 4
我有一个带列的数据框 x1, x2, group我想生成一个带有额外列的新数据框 rank表示x1的顺序在其组中。 有相关问题here ,但已接受的答案似乎不再有效。 到这里为止,很好: librar
我有一个示例 df,如下所示: d% group_by(CaseNo) %>% arrange(desc(Submissiondate)) %>% dplyr::mutate(rank = row_n
我有一个数据框,其中包含一些数据输入错误。 我希望将每组的这些异常值替换为每组最常见的值。 我的数据如下: df % group_by(CODE) %>% mutate(across(c(DOSAGE
我是一名优秀的程序员,十分优秀!