如何在不创建分组变量的情况下进行group_by?

斯卡比

我需要执行一个基本group_by/mutate利用辅助分组变量操作。例如:

df <- data.frame(
  u = c(0, 0, 1, 0, 1),
  v = c(8, 4, 2, 3, 5)
)

df %>%
  group_by(tmp = cumsum(u)) %>%
  mutate(w = cumprod(v)) %>%
  ungroup %>%
  select(-tmp)

我的问题是,如果df碰巧已经包含一个名为tmpI的列,它将丢失它。

当然,我可以选择一个非常奇特的名称,而不是tmp降低碰撞的可能性(或者甚至可以选择strrep("z", max(nchar(names(df))) + 1)确定的名称),但是我更喜欢一个更干净的解决方案。

换句话说,我正在寻找dplyr与此data.table等效的内容

setDT(df)[, w := cumprod(v), by = cumsum(u)]
阿克伦

我们可以创建一个函数来解决这个问题。假设要创建的临时分组变量为'tmp',则通过与数据集的列名称连接并调用make.unique,如果数据集中已经存在'tmp'列,则重复的列将被重命名为'tmp.1 '。使用!!,将列命名为'tmp.1'(来自nm1)不会影响数据集中已经存在的'tmp'。如果没有“ tmp”列,则分组列将被命名为“ tmp”,随后使用select

f1 <- function(dat, grpCol, Col) {
  grpCol <- enquo(grpCol)
  Col <- enquo(Col)

 changeCol <- "tmp"
 nm1 <-  tail(make.unique(c(names(dat), changeCol)), 1)
 dat %>%
    group_by(!! (nm1) := cumsum(!! grpCol)) %>%
    mutate(w = cumprod(!!Col)) %>%
     ungroup %>%
     select(-one_of(nm1)) 


}

-运行功能

f1(df, u, v)
# A tibble: 5 x 3
#      u     v     w
#  <dbl> <dbl> <dbl>
#1  0     8.00  8.00
#2  0     4.00 32.0 
#3  1.00  2.00  2.00
#4  0     3.00  6.00
#5  1.00  5.00  5.00


 f1(df %>% mutate(tmp = 1), u, v) #create a 'tmp' column in dataset
# A tibble: 5 x 4
#      u     v   tmp     w
#  <dbl> <dbl> <dbl> <dbl>
#1  0     8.00  1.00  8.00
#2  0     4.00  1.00 32.0 
#3  1.00  2.00  1.00  2.00
#4  0     3.00  1.00  6.00
#5  1.00  5.00  1.00  5.00

作为后续(有关@Frank的评论),关于传递表达式

expr <- quos(tmp = cumsum(u), w = cumprod(v))
#additional checks outside the function
names(expr)[1] <- if(names(expr)[1] %in% names(df)) 
             strrep(names(expr)[1], 2) else names(expr)[1]


f2 <- function(dat, exprs ){

dat %>%
    group_by(!!! exprs[1]) %>%
    mutate(!!! exprs[2])

}

f2(df, expr)
# A tibble: 5 x 4
# Groups: tmp [3]
#      u     v   tmp     w
#  <dbl> <dbl> <dbl> <dbl> 
#1  0     8.00  0     8.00
#2  0     4.00  0    32.0 
#3  1.00  2.00  1.00  2.00
#4  0     3.00  1.00  6.00
#5  1.00  5.00  2.00  5.00

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不写select的情况下进行分组

如何在 Python 中不创建不同变量的情况下进行绘图

如何在不创建变量的情况下使用 Javascript?

熊猫如何在不丢失其他列信息的情况下进行分组

Altair-如何在不操纵DataFrame的情况下创建分组的条形图

熊猫如何在以下情况下进行分组

如何在不创建sed中间文件的情况下进行替换?

如何在不创建中间 Seq 的情况下对 Iterable 进行排序?

如何在不创建DataView的情况下对DataTable行进行排序?

熊猫如何在不创建新列的情况下进行外部联接

C#如何在不创建实例的情况下访问变量?

如何在不递归的情况下进行ls

如何在不更改变量的情况下递归

如何在不指定final的情况下访问变量?

如何在不破坏循环的情况下返回变量?

如何在不导航的情况下创建抽屉菜单?

Java 8-如何在不创建临时变量的情况下从List <T>和新T创建Iterable?

如何在没有for循环的情况下使用Itertools group_by迭代器方法?

如何在不设置环境变量的情况下使用Javascript向Google Sheets API进行身份验证?

Pyomo:如何在不声明名称的情况下创建新的模型变量,然后将其存储在字典中?

如何在不创建子shell的情况下将命令的输出存储在变量中[Bash <v4]

如何在不进行操作的情况下对熊猫数据框进行分组或聚合

SAS SQL:如何在不首先提取数据的情况下(基于Case分组)?

如何在不丢失分组依据的情况下基于groupby变换填充NaN?

如何在不循环的情况下按 LINQ 查询结果分组到 DataGridView

如何在不聚合原始RDD分区的情况下将多个RDD分组?

如何在不评估变量的情况下将变量传递给自定义组件?

如何在不考虑时间的情况下按日期时间列进行分组

如何在不使表格混乱的情况下用表格行显示对多个元素进行分组?