r - 使用 dplyr / magrittr 传递分组的 data.frame
问题描述
使用base::by()
and data.table
,我们可以按变量分组,然后能够访问作为分组子集的 data.frame。如何使用magrittr或dplyr进行等效操作?
我尝试过tib %>% group_by(grp) %>% mutate(V2 = fx(.))
,但不是通过子组,而是通过tibble
LHS 中的整个分组。这是一个 MRE:
library(dplyr)
tib = tibble(grp = rep(1:2, 1:2),
V1 = 1:3)
tib
#> # A tibble: 3 x 2
#> grp V1
#> <int> <int>
#> 1 1 1
#> 2 2 2
#> 3 2 3
fx = function(x){
ans = seq(nrow(x))
print(ans)
}
tib %>%
group_by(grp)%>%
mutate(V2 = fx(.))
#> [1] 1 2 3
#> Error: Problem with `mutate()` input `V2`.
#> x Input `V2` can't be recycled to size 1.
#> i Input `V2` is `fx(.)`.
#> i Input `V2` must be size 1, not 3.
#> i The error occured in group 1: grp = 1.
这是我希望使用data.table的行为:
library(data.table)
as.data.table(tib)[, V2 := fx(.SD), grp][]
#> [1] 1
#> [1] 1 2
#> grp V1 V2
#> <int> <int> <int>
#> 1: 1 1 1
#> 2: 2 2 1
#> 3: 2 3 2
解决方案
您可以cur_data()
从dplyr
1.0.0 开始使用。
library(dplyr)
tib %>% group_by(grp)%>% mutate(V2 = fx(cur_data()))
#[1] 1
#[1] 1 2
# A tibble: 3 x 3
# Groups: grp [2]
# grp V1 V2
# <int> <int> <int>
#1 1 1 1
#2 2 2 1
#3 2 3 2
请注意,cur_data()
传递数据时不分组变量 ( grp
)。如果你想分组变量应该传递给函数使用cur_data_all()
。
推荐阅读
- spring-boot - 如何使用 Spring 集成处理大文件
- c++ - 使用 VCPKG 在 Visual Studio 上安装 geos
- amazon-web-services - 将位置历史记录 REST API 转换为 AWS 位置 ping 的“云原生”方式是什么?
- c# - .Net Core OData 以不同方式序列化日期时间
- asp.net - 如何编写一个存储过程/函数来返回一个对象列表,该列表还包含一个列表作为其属性给 C#
- go - 与solidity 函数相比,Go ABI.Pack 参数类型应该是什么样的?
- javascript - AdminBSBMaterialDesign-Bootstrap-select data-live-search 最近在 Google Chrome 上没有响应
- javascript - 更新 Redux 状态问题?
- javascript - 创建一个 html 页面以从 pancakeswap 转换自定义加密货币的值
- python - 如何在 Python 中找到具有非明显文件类型的 url 中的图像的文件类型