[英]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.