簡體   English   中英

如何在 group_by (dplyr) 中使用粘貼?

[英]How to use paste within group_by (dplyr)?

我有以下數據(示例):

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.

我的問題:如何在不使用粘貼的情況下避免此錯誤並獲得與以前相同的結果? 使用 paste 命令可能看起來很奇怪,但我需要使用字符占位符。

我很高興有任何幫助!

我們可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM