r - 如何在 group_by (dplyr) 中使用 paste?
问题描述
我有以下数据(示例):
id <- c(1, 1, 2, 2, 2)
x <- c(2, 2, 3, 3, 4)
dat <- data.frame(id, x)
现在我可以按组(id)计算 x 的出现并保存在 dat2 中:
dat2 <- dat %>% group_by(id, x) %>% dplyr::mutate(count = n())
现在计算 id 的案例:
dat2 <- dat2 %>% group_by(id) %>% dplyr::mutate(j = n())
这一切正常。结果:
dat2
# A tibble: 5 x 4
# Groups: id [2]
id x count j
<dbl> <dbl> <int> <int>
1 1 2 2 2
2 1 2 2 2
3 2 3 2 3
4 2 3 2 3
5 2 4 1 3
现在到我的问题。我想在“group_by”中使用粘贴。更准确地说,我想使用两个字符“占位符”i(用于 id)和 z(用于 x)来控制分组。我不想使用“真实”对象 id 和 x:
i <- "id"
z <- "x"
dat2 <- dat %>% group_by(dat[[paste(i, sep = "")]], dat[[paste(z, sep = "")]]) %>% dplyr::mutate(count = n())
这第一步也有效,与上述相同。但是,进入下一个最后一步时,会发生错误:
dat2 <- dat2 %>% group_by(dat[[paste(i, sep = "")]]) %>% dplyr::mutate(j = n ())
Error: Problem with `mutate()` input `..1`.
x Input `..1` can't be recycled to size 2.
i Input `..1` is `dat[[paste(i, sep = "")]]`.
i Input `..1` must be size 2 or 1, not 5.
i The error occured in group 1: dat[[paste(i, sep = "")]] = 1, dat[[paste(z, sep = "")]] = 2.
Run `rlang::last_error()` to see where the error occurred.
我的问题:如何在不使用粘贴的情况下避免此错误并获得与以前相同的结果?使用粘贴命令可能看起来很奇怪,但我需要使用字符占位符。
我很高兴有任何帮助!
解决方案
我们可以使用across
而不是paste
library(dplyr)
dat %>%
group_by(across(all_of(c(i, z)))) %>%
mutate(count = n()) %>%
group_by(across(all_of(i))) %>%
mutate(j = n())
# A tibble: 5 x 4
# Groups: id [2]
id x count j
<dbl> <dbl> <int> <int>
1 1 2 2 2
2 1 2 2 2
3 2 3 2 3
4 2 3 2 3
5 2 4 1 3
或者代替分组,使用add_count
dat %>%
add_count(across(all_of(c(i, z))), name = 'count') %>%
add_count(across(all_of(i)), name = 'j')
id x count j
1 1 2 2 2
2 1 2 2 2
3 2 3 2 3
4 2 3 2 3
5 2 4 1 3
推荐阅读
- webview - Paypal 自适应支付结账页面未在移动 webview 中打开
- amazon-web-services - 配置 Terraform S3 后端时出错
- stripe-payments - Plaid + Stripe 从我的账户转移到 Plaid 认证的银行账户
- css - 我的页面没有反映我所做的任何 CSS 样式更改
- c# - 根据谁登录(基于 AD auth)锁定我的应用程序的某些功能
- windows - 尝试从 GitHub 克隆时出现权限被拒绝(公钥)错误
- c++ - 有没有办法在使用 Booth 算法的二进制乘法期间捕获溢出/下溢?
- android - 如何使用 Amazon Voice Service 或 Alexa 对我的应用进行语音查询
- python - 是否有 Python 函数可以根据条件过滤并将二进制值分配给数据集中的列?
- excel - 仅对具有前缀字母的单元格求和