- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最新版本的 dplyr 不推荐使用下划线版本的函数,例如 filter_,转而使用 tidy evaluation .
新方式下划线形式的新形式是什么?如何使用 R CMD 检查来避免 undefined symbol ?
library(dplyr)
df <- data_frame(id = rep(c("a","b"), 3), val = 1:6)
df %>% filter_(~id == "a")
# want to avoid this, because it references column id in a variable-style
df %>% filter( id == "a" )
# option A
df %>% filter( UQ(rlang::sym("id")) == "a" )
# option B
df %>% filter( UQ(as.name("id")) == "a" )
# option C
df %>% filter( .data$id == "a" )
是否有首选或更考虑的形式?选项 C 是最短的,但在我的一些现实世界中较大的数据集和更复杂的 dplyr 结构上速度较慢:
microbenchmark(
sym = dsPClosest %>%
group_by(!!sym(dateVarName), !!sym("depth")) %>%
summarise(temperature = mean(!!sym("temperature"), na.rm = TRUE)
, moisture = mean(!!sym("moisture"), na.rm = TRUE)) %>%
ungroup()
,data = dsPClosest %>%
group_by(!!sym(dateVarName), .data$depth ) %>%
summarise(temperature = mean(.data$temperature , na.rm = TRUE)
, moisture = mean(.data$moisture , na.rm = TRUE)) %>%
ungroup()
,times=10
)
#Unit: milliseconds
# expr min lq mean median uq max neval
# sym 80.05512 84.97267 122.7513 94.79805 100.9679 392.1375 10
# data 4652.83104 4741.99165 5371.5448 5039.63307 5471.9261 7926.7648 10
还有一个answer for mutate_使用更复杂的语法。
最佳答案
根据您的评论,我猜应该是:
df %>% filter(!!as.name("id") == "a")
rlang
是不必要的,因为您可以使用 !!
和 as.name
而不是 UQ
来完成此操作和sym
。
但也许更好的选择是范围过滤器,它可以避免与 quosure 相关的问题:
df %>% filter_at(vars("id"), all_vars(. == "a"))
在上面的代码中,vars()
确定我们要对哪些列应用过滤语句(在 filter_at
的帮助中,过滤语句称为“predicate”。在本例中,vars("id")
表示过滤语句仅应用于 id
列。过滤语句可以是 all_vars()
或 any_vars()
语句,尽管它们在本例中是等效的。all_vars(.== "a")
表示所有vars("id")
中的列必须等于 "a"
。是的,这有点令人困惑。
与您的示例类似的数据的计时:在本例中,我们使用 group_by_at
和 summarise_at
,它们是这些函数的作用域版本:
set.seed(2)
df <- data_frame(group = sample(1:100,1e4*52,replace=TRUE),
id = rep(c(letters,LETTERS), 1e4),
val = sample(1:50,1e4*52,replace=TRUE))
microbenchmark(
quosure=df %>% group_by(!!as.name("group"), !!as.name("id")) %>%
summarise(val = mean(!!as.name("val"))),
data=df %>% group_by(.data$group, .data$id) %>%
summarise(val = mean(.data$val)),
scoped_group_by = df %>% group_by_at(vars("group","id")) %>%
summarise_at("val", mean), times=10)
Unit: milliseconds
expr min lq mean median uq max neval cld
quosure 59.29157 61.03928 64.39405 62.60126 67.93810 72.47615 10 a
data 391.22784 394.65636 419.24201 413.74683 425.11709 498.42660 10 b
scoped_group_by 69.57573 71.21068 78.26388 76.67216 82.89914 91.45061 10 a
原始答案
我认为在这种情况下,您可以输入过滤器变量作为裸名称,然后使用 enquo
和 !!
(相当于 UQ
) 使用过滤器变量。例如:
library(dplyr)
fnc = function(data, filter_var, filter_value) {
filter_var=enquo(filter_var)
data %>% filter(!!filter_var == filter_value)
}
fnc(df, id, "a")
id val
1 a 1
2 a 3
3 a 5
fnc(mtcars, carb, 3)
mpg cyl disp hp drat wt qsec vs am gear carb
1 16.4 8 275.8 180 3.07 4.07 17.4 0 0 3 3
2 17.3 8 275.8 180 3.07 3.73 17.6 0 0 3 3
3 15.2 8 275.8 180 3.07 3.78 18.0 0 0 3 3
关于r - dplyr tidyeval 相当于下划线函数版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47664611/
在 Chapel 中以固定增量遍历一系列实数的最惯用方法是什么? C 等效代码为: for (x = 0.0; x start, "Stop must be greater than start");
在编写我的 VBA 宏时,我经常使用“GoTo”以便在不离开 Sub 的情况下跳转到宏的前一部分。现在我正在将我所有的宏转换为 Google Apps 脚本,我正试图找到“GoTo”的等效项。 Sub
作为一个(不幸)对 jQuery 的了解多于 raw javascript 的人,我现在正在学习是时候用原始 javascript 替换我的所有代码了。不,这不是必需的,但对我来说这是一种更简单的学习
当我运行 git help -a它向我显示了内部命令列表、我所有的别名和我所有的外部 git 命令(即我的路径中以 git- 开头的任何可执行文件)。我想要的是一个可以作为 git which 运行的
我正在使用的查询: SELECT COUNT(*), SUM(amount) AS amount, FROM_UNIXTIME(added, '%W (%e/%m)') AS dail
我有一堆我正在调试的脚本,都是嵌套的并且非常讨厌。 只是想知道我是否能够设置一些与 bash 的 -x 选项等效的环境变量。这将为我节省大量时间。 我已经寻找答案,但似乎它不存在 - 希望你们聪明的人
ObjC [MyObject doThisWithString:string?: [MyObject otherString]]; 我如何在 Swift 中执行此操作? extension MyObj
我目前正在运行 Sonar 来对我的代码进行静态分析。当我在分析java文件并想抑制某个警告时,我使用了@SuppressWarnings(nameOfTheWarningOnSonar)注解。我想知
我最近一直在研究 Elixir 和 Akka,这让我想到:Clojure 中的等价物是什么? 我发现了几篇关于代理与 Actor 的“消息吞吐量比较”帖子,但它们来自 8 年前 一个答案曾经是agen
我以前工作的地方,我们使用 Mercurial 进行版本控制。我有一份新工作,我们在那里使用 Subversion。我是 Subversion 的新手。 我发现自己想知道自从我在远程仓库上结帐以来 c
寻找一种等效的剪切和粘贴策略来复制 vim 的“cut til”。如果我真的知道它在 vim 中的名称,我敢肯定这是 googleable,但这是我要找的: 如果我有一个像这样的文本块: foo ba
我有一段 .NET 代码,我想将其移植到 64 位。这些代码基本上是一组对其他 C dll 的 P/Invoke 调用。 C dll 中的函数之一具有参数“size_t”。我应该在我的 P/Invok
开发 iPhone 应用程序的标准开发者平台是什么,例如相当于 Eclipse? 最佳答案 Xcode 是 iOS 开发的标准且唯一(由 Apple 支持)IDE。它也是必需的,因为如果您想要任何开发
我想将某些内容推送到 iPhone 的响应者链上。也就是说,我想将选择器发送到 UIResponder子类,如果它不响应所述选择器,则将其传递给其 nextResponder . 有什么想法吗? 最佳
我需要一个与 SQL 中的此查询等效的 Firebase 查询: select * from your_table where id in (123, 345, 679) 你会如何在 firebase
我有一个很好的解决方案: $.get('getdbstuff.php?type=meta,'.$var_id, function(data){ $(data).appendTo("head")
我正处于 Cassandra 应用程序数据建模的初始阶段。此应用程序具有现有的关系持久层,必须用 Cassandra 替换。 应用程序为用户使用一个名为login_log 的表,它提供所有应用程序中任
如标题所述,TensorFlow 是否存在与 numpy.all() 函数等效的函数来检查 bool 张量中的所有值是否为 True?实现此类检查的最佳方法是什么? 最佳答案 使用tf.reduce_
在 Stata 中,如果我有以下变量:var1、var2、var3、var4、var5 和 var6,我可以使用命令 var* 选择所有它们。 R 有类似的功能吗? 最佳答案 “dplyr”包中的se
我正处于 Cassandra 应用程序数据建模的初始阶段。此应用程序具有现有的关系持久层,必须用 Cassandra 替换。 应用程序为用户使用一个名为login_log 的表,它提供所有应用程序中任
我是一名优秀的程序员,十分优秀!