我正在构建一个整齐兼容的函数,供在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}},也不会仅仅提取变量并从那里获取内容。
答案 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