小编Lim*_*mey的帖子

嵌套函数调用中的 NSE

我想使用实用程序函数来检查给定的列中是否存在给定的data.frame. 我在 tidyverse 中穿梭。到目前为止我想出的最好的是

library(magrittr)

columnExists <- function(data, col) {
  tryCatch({
    rlang::as_label(rlang::enquo(col)) %in% names(data)
    },
    error=function(e) FALSE
  )
}
Run Code Online (Sandbox Code Playgroud)

这适用于全球环境

> mtcars %>% columnExists(mpg)
[1] TRUE
> mtcars %>% columnExists(bad)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

但当从另一个函数中调用时则不然,这是我的实际用例

outerFunction <- function(d, col) {
  d %>% columnExists((col))
}
> mtcars %>% outerFunction(mpg)  # Expected TRUE
[1] FALSE
> mtcars %>% outerFunction(bad) # Expected FALSE
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?是否有可能有一个函数在全局环境中以及嵌套在另一个函数中时也能正常工作?

我发现了几篇与检查给定列是否存在相关的帖子,但它们似乎都假设列名将作为字符串传递,或者检查存在的调用不是嵌套的(或两者兼而有之)。这里情况不同。

r nse tidyeval

6
推荐指数
1
解决办法
91
查看次数

Stringr 函数 str_extract_all() 突然不适用于我尝试的任何数据集

我重新运行了一些我多年来一直使用的 R 代码,似乎一夜之间它就停止工作了。数据没有任何变化,代码也没有任何变化,但是 R 包 stringr 中的函数 str_extract_all 不再起作用。

\n

数据来自 .txt 文件,该文件是贝叶斯饮食模型的输出。我想把它做成一张桌子,这样我就可以查看个人的饮食。它看起来像这样:

\n

狼队:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n
个人部分
狼1.鹿.50
狼1.麋鹿.30
狼1.驼鹿.20
狼2.鹿.40
狼2.麋鹿.35
狼2.驼鹿.25
\n
\n

我一直使用的创建新食物栏的代码行是:

\n
Wolves$Food <- unlist(\n  str_extract_all(\n    Wolves$Individual, \n    c("Deer", "Elk", "Moose")\n  ), \n  use.names=FALSE\n)\n
Run Code Online (Sandbox Code Playgroud)\n

所以新数据将如下所示:

\n
| Individual | Proportion| Food\n| ---------- | --------- |\n| Wolf1.Deer | .50       | Deer\n| Wolf1.Elk  | .30       | Elk\n| Wolf1.Moose| .20       | Moose\n| Wolf2.Deer | .40       | Deer \n| …
Run Code Online (Sandbox Code Playgroud)

r stringr tidyverse

1
推荐指数
1
解决办法
389
查看次数

在我的基准测试项目中,Base R 对数据集的排序速度比 dplyr 或 data.table 快得多。为什么是这样?我们都应该使用 Base R 吗?

我正在比较不同数据操作包在不同大小的数据集上对某些操作的执行情况。

我生成了一个虚拟数据集(iris x iris 的笛卡尔积。毫无意义,但本质上只是一个 22500 x 10 数据集)。

library(dplyr)
library(data.table)
library(rbenchmark)

iris_big <- merge(x = iris, y = iris, by = NULL) 

iris_big_dt <- as.data.table(iris_big) #for data.table

benchmark("Base R" = {
            iris_big[base::order("Petal.Width.y")]
          },
          "dplyr" = {
            dplyr::arrange(iris_big,"Petal.Width.y")
          },          

          "data.table" = {
            data.table::setorder(iris_big_dt,"Petal.Width.y")
          },
          replications = 30,
          columns = c("test", "replications", "elapsed",
                      "relative", "user.self", "sys.self"))

Run Code Online (Sandbox Code Playgroud)

输出::

| test       | replications   |elapsed|...|sys.self|
| --------   | -------------- |----   |---|---|
| Base R     | 30             |0.00   |...|0.00|
| data.table | 30             |0.04   |...|0.02| …
Run Code Online (Sandbox Code Playgroud)

performance r dplyr data.table

0
推荐指数
1
解决办法
1133
查看次数

标签 统计

r ×3

data.table ×1

dplyr ×1

nse ×1

performance ×1

stringr ×1

tidyeval ×1

tidyverse ×1