我如何像使用.lang一样从rlang的.data获取数据属性?

时间:2019-08-04 05:11:38

标签: r rlang

我正在构建一个整齐兼容的函数,供在dplyr的{​​{1}}内部使用,我想在其中传递变量以及正在使用的数据集,并使用来自两者都可以建立向量。

作为一个基本示例,假设我想返回一个包含变量平均值和数据集中行数的字符串(我知道我可以取mutate的长度,忽略它,这是一个例子)。

var
好的,到目前为止。但是现在也许我希望它能处理分组数据。 library(tidyverse) library(rlang) info <- function(var,df = get(".",envir = parent.frame())) { paste(mean(var),nrow(df),sep=', ') } dat <- data.frame(a = 1:10, i = c(rep(1,5),rep(2,5))) #Works fine, 'types' contains '5.5, 10' dat %>% mutate(types = info(a)) 仅来自一组,而var将是完整的数据集。因此,我将使用.的{​​{1}}代词,它只是正在处理的数据。

但是,rlang.data不同。 .data是数据集,但是.只是一个代名词,我可以使用.提取变量。

.data

如何从.data[[varname]]获取完整的东西?我知道我没有在示例中包括它,但是具体来说,我俩都需要info2 <- function(var,df = get(".data",envir = parent.frame())) { paste(mean(var),nrow(.data),sep=', ') } #Doesn't work. nrow(.data) gives blank strings dat %>% group_by(i) %>% mutate(types = info2(a)) 中的某些内容和.data中的变量中的某些内容,这些内容已正确地分组为分组对象,因此都不会恢复为{{ 1}},也不会仅仅提取变量并从那里获取内容。

2 个答案:

答案 0 :(得分:1)

如以上注释中的Alexis所述,这是不可能的,因为这不是.data的预期用途。但是,既然我已经放弃直接执行此操作,那么我已经结合使用..data来解决问题。

info <- function(var,df = get(".",envir = parent.frame())) {
  #First, get any information you need from .
  fulldatasize <- nrow(df)

  #Then, check if you actually need .data,
  #i.e. the data is grouped and you need a subsample
  if (length(var) < nrow(df)) {
      #If you are, get the list of variables you want from .data, maybe all of them
      namesiwant <- names(df)

      #Get .data
      datapronoun <- get('.data',envir=parent.frame())

      #And remake df using just the subsample
      df <- data.frame(lapply(namesiwant, function(x) datapronoun[[x]]))
      names(df) <- namesiwant
  }

  #Now do whatever you want with the .data data
  groupsize <- nrow(df)

  paste(mean(var),groupsize,fulldatasize,sep=', ')
}

dat <- data.frame(a = 1:10, i = c(rep(1,5),rep(2,5)))

#types contains the within-group mean, then 5, then 10
dat %>% group_by(i) %>% mutate(types = info(a))

答案 1 :(得分:0)

为什么在这里不使用length()代替nrow()

dat <- data.frame(a = 1:10, i = c(rep(1,5),rep(2,5)))

info <- function(var) {
  paste(mean(var),length(var),sep=', ')
}
dat %>% group_by(i) %>% mutate(types = info(a))
#> # A tibble: 10 x 3
#> # Groups:   i [2]
#>        a     i types
#>    <int> <dbl> <chr>
#>  1     1     1 3, 5 
#>  2     2     1 3, 5 
#>  3     3     1 3, 5 
#>  4     4     1 3, 5 
#>  5     5     1 3, 5 
#>  6     6     2 8, 5 
#>  7     7     2 8, 5 
#>  8     8     2 8, 5 
#>  9     9     2 8, 5 
#> 10    10     2 8, 5