小编Tim*_*Fan的帖子

tidyverse 中多个群体的引导:rsample 与 broom

这个SO问题broom::bootstrap中,使用指定by_group参数的函数由多个组和子组引导似乎很容易TRUE

我想要的输出是一个包含 n 行的嵌套 tibble,其中数据列包含每个引导程序调用生成的引导数据(每个组和子组具有与原始数据相同数量的案例)。

broom我做了以下事情:

# packages
library(dplyr)
library(purrr)
library(tidyr)
library(tibble)
library(rsample)
library(broom)

# some data to bootstrap
set.seed(123)
data <- tibble(
  group=rep(c('group1','group2','group3','group4'), 25),
  subgroup=rep(c('subgroup1','subgroup2','subgroup3','subgroup4'), 25),
  v1=rnorm(100),
  v2=rnorm(100)
)

# the actual approach using broom::bootstrap
tibble(id = 1:100) %>% 
  mutate(data = map(id, ~ {data %>%
      group_by(group,subgroup) %>% 
      broom::bootstrap(100, by_group=TRUE)}))
Run Code Online (Sandbox Code Playgroud)

由于该broom::bootstrap函数已被弃用,因此我使用所需的输出重建了我的方法rsample::bootstraps。获得我想要的输出似乎要复杂得多。生成分组引导程序时,我是否做错了什么,或者在 tidyverse 中事情变得更加复杂?

data %>%
  dplyr::mutate(group2 = group,
                subgroup2 = subgroup) %>% 
  tidyr::nest(-group2, -subgroup2) %>% 
  dplyr::mutate(boot  = …
Run Code Online (Sandbox Code Playgroud)

r resampling tidyverse

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

检查某个函数是否在 R 的嵌套函数中使用

我想创建一个函数check_sym,它将另一个函数f作为参数并检查是否在f特定函数内部使用。

具体来说,我想检查是否使用f了形式的内部非标准评估!! sym

我可以用一个简单的技巧来做到这一点,将函数体转换为字符串,然后使用正则表达式检查"!!sym\\(".

library(dplyr)
library(purrr)
library(rlang)

check_sym <- function(f) {
  f <- as.list(body(f))
  f <- unlist(as.character(f))
  purrr::some(f, function(x) grepl("!!sym\\(", x))
}

foo <- function(df, x) { 
  select(df, !! sym(x))
}

check_sym(foo)
#> [1] TRUE
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2020 年 2 月 16 日创建

然而,虽然这是可能的,但我正在寻找一种不依赖字符串和正则表达式的方法,而是理想情况下一些查看函数内部并在更深层次“看到”所有函数调用的方法,这会更可靠.

任何想法表示赞赏。

基于接受的答案的最终解决方案:

基于 MrFlick 下面的回答,我的实际解决方案如下:

我将 check_syms 定义为:

check_sym <- function(f) {
  grepl("!!sym", paste(all.names(body(f)), collapse = ""))
}
Run Code Online (Sandbox Code Playgroud)

"!! sym"与仅调用 example …

r function

5
推荐指数
2
解决办法
146
查看次数

tidyverse 中变量的一堆重新编码(功能/元编程)

我想用尽可能少的函数调用重新编码一堆变量。我有一个 data.frame,我想在其中重新编码许多变量。我创建了一个包含所有变量名称和要执行的重新编码参数的命名列表。在这里我使用mapand没有问题dpylr。但是,当涉及到重新编码时,我发现recodecar包中使用它要容易得多,而不是使用它dpylr自己的重新编码功能。一个附带问题是是否有一种很好的方法可以用dplyr::recode.

作为下一步,我将 data.frame 分解为嵌套的 tibble。在这里,我想在每个子集中进行特定的重新编码。这就是事情变得复杂的地方,我无法再在dpylr管道中做到这一点。我唯一能工作的是一个非常丑陋的嵌套for loop.

寻找以一种漂亮而干净的方式做到这一点的想法。

让我们从简单的例子开始:

library(carData)
library(dplyr)
library(purrr)
library(tidyr)

# global recode list
recode_ls = list(

  mar = "'not married' = 0;
          'married' = 1",

  wexp = "'no' = 0;
          'yes' = 1"
)

recode_vars <- names(Rossi)[names(Rossi) %in% names(recode_ls)]

Rossi2 <- Rossi # lets save results under a different name

Rossi2[,recode_vars] <- recode_vars %>% map(~ car::recode(Rossi[[.x]],
                                                          recode_ls[.x],
                                                          as.factor = FALSE, …
Run Code Online (Sandbox Code Playgroud)

r recode purrr tidyverse

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

为什么无法使用 lapply 在包装函数中调用子集

subset_base是 r 基函数的简单形式subset()。该示例取自 Advanced R 第 20.6.1 章。

这个函数本身工作得很好:

subset_base <- function(data, rows) {
  rows <- substitute(rows)
  rows_val <- eval(rows, data, parent.frame())
  data[rows_val, , drop = FALSE]
}

my_df <- data.frame(x = 1:3)
  
subset_base(my_df, x == 1)
#>   x
#> 1 1
Run Code Online (Sandbox Code Playgroud)

然而,当我们构建一个包装函数时apply_subset,在这个包装函数中定义一些值并在提供参数时zzz调用(在同一函数中)找不到它。lapply()subset_basezzz

我想更好地理解为什么zzz找不到。我的思维模型如下: subset_base被调用,lapply被调用apply_subset。在subset_base我们内部评估rows所提供的参数,data.frame data该参数会自动转换为环境。该环境由调用环境封装parent.frame()。这应该是lapply. 我认为这个环境再次有lapply作为其父级的调用环境。这将是 的执行环境apply_subset。但事实似乎并非如此,因为如果这是真的,zzz …

r

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

在闪亮的R中自动调整textAreaInput的大小

我正在尝试调整这个关于如何通过 javascript 自动调整文本区域输入大小以实现闪亮 R 的答案。理想情况下,我想避免使用诸如闪亮JS之类的帮助程序包。

首先,我尝试了纯 javascript 实现,将 javascript 按原样加载到应用程序中(方法 1)。然后我尝试从闪亮的observeEvent中触发javascript函数(方法2)。

这两种方法都不起作用。看来我错过了一些东西。

方法一:

library(shiny)

jsCode1 <- "
            var observe;
            if (window.attachEvent) {
            observe = function (element, event, handler) {
            element.attachEvent('on'+event, handler);
            };
            }
            else {
            observe = function (element, event, handler) {
            element.addEventListener(event, handler, false);
            };
            }
            function init () {
            var text = document.getElementById('text');
            function resize () {
            text.style.height = 'auto';
            text.style.height = text.scrollHeight+'px';
            }
            /* 0-timeout to get the already changed text */
            function delayedResize () …
Run Code Online (Sandbox Code Playgroud)

javascript r shiny

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

在R中总结组意味着如何创建有条件的新组

我有数据,我想总结一下组的意思.然后,我想将一些较小的组(匹配某个n <x条件)重新组合成一个名为"其他"的组.我找到了一种方法来做到这一点.但感觉有更有效的解决方案.我想知道data.table方法如何解决问题.

以下是使用tibble和dyplr的示例.

# preps
library(tibble)
library(dplyr)
set.seed(7)

# generate 4 groups with more observations
tbl_1  <- tibble(group = rep(sample(letters[1:4], 150, TRUE), each = 4),
                 score = sample(0:10, size = 600, replace = TRUE))

# generate 3 groups with less observations
tbl_2 <- tibble(group = rep(sample(letters[5:7], 50, TRUE), each = 3),
                score = sample(0:10, size = 150, replace = TRUE)) 

# put them into one data frame
tbl <- rbind(tbl_1, tbl_2)

# aggregate the mean scores and count the observations …
Run Code Online (Sandbox Code Playgroud)

r dplyr data.table tibble

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

标签 统计

r ×6

tidyverse ×2

data.table ×1

dplyr ×1

function ×1

javascript ×1

purrr ×1

recode ×1

resampling ×1

shiny ×1

tibble ×1