发布
社区首页 >问答首页 >如何在group_by中使用粘贴?

如何在group_by中使用粘贴?
EN

Stack Overflow用户
提问于 2021-07-19 18:41:19
回答 1查看 305关注 0票数 1

我有以下数据(例如):

代码语言:javascript
代码运行次数:0
复制
id <- c(1, 1, 2, 2, 2)
x <- c(2, 2, 3, 3, 4)
dat <- data.frame(id, x)

现在,我可以按组(id)计数x的出现情况,并在dat2中保存:

代码语言:javascript
代码运行次数:0
复制
dat2 <- dat %>% group_by(id, x) %>% dplyr::mutate(count = n())

现在计算id的情况:

代码语言:javascript
代码运行次数:0
复制
dat2 <- dat2 %>% group_by(id) %>% dplyr::mutate(j = n())

一切都很好。结果:

代码语言:javascript
代码运行次数:0
复制
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:

代码语言:javascript
代码运行次数:0
复制
i <- "id"
z <- "x"

dat2 <- dat %>% group_by(dat[[paste(i, sep = "")]], dat[[paste(z, sep = "")]]) %>% dplyr::mutate(count = n())

这个第一步也是有效的,和上面一样。但是,进入下一个最后一步时,会出现一个错误:

代码语言:javascript
代码运行次数:0
复制
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.

我的问题是:如何避免这一错误,并获得与以前一样的结果,而不用粘贴?使用粘贴命令可能看起来很奇怪,但我需要使用字符占位符。

我很高兴有任何帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-19 18:42:37

我们可以用across代替paste

代码语言:javascript
代码运行次数:0
复制
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代替分组

代码语言:javascript
代码运行次数:0
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68445490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档