我有以下数据(例如):
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.
我的问题是:如何避免这一错误,并获得与以前一样的结果,而不用粘贴?使用粘贴命令可能看起来很奇怪,但我需要使用字符占位符。
我很高兴有任何帮助!
发布于 2021-07-19 18:42:37
我们可以用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
https://stackoverflow.com/questions/68445490
复制相似问题