如何解决R:在正则表达式中使用 Summarize()、accross() 和 where()
我有以下数据集:
Lines <- "id time sex Age Obs_A Obs_B Obs_C
1 1 male 90 0 0 0
1 2 male 91 0 0 0
1 3 male 92 1 1 0
2 1 female 87 0 1 1
2 2 female 88 0 1 0
2 3 female 89 0 0 1
3 1 male 50 0 1 0
3 2 male 51 1 0 0
3 3 male 52 0 0 0
4 1 female 54 0 1 0
4 2 female 55 0 1 0
4 3 female 56 0 1 0"
我想将 summarize
与正则表达式 (grepl
) 结合起来,以便重新格式化以 Obs
开头的变量(例如取中位数),同时对其他变量进行其他操作。例如这样的事情:
TTE <- TTE %>%
group_by(id,across(where(is.character))) %>%
summarise(id = first(id),sex = first(sex),Age = mean(Age),across(where(grepl("Obs")),mean),across(where(is.numeric),max)) %>%
ungroup
尽管如此,我收到以下错误:
x argument "x" is missing,with no default
知道如何以一致的方式使用 summarize()
、across()
、where()
和 grepl()
吗?
解决方法
对于 dplyr
,您可以使用 tidyselect 函数选择 across
中的列。
library(dplyr)
TTE %>%
group_by(id,across(where(is.character))) %>%
summarise(Age = mean(Age),across(starts_with('Obs'),mean),across(where(is.numeric),max)) %>%
ungroup
# id sex Age Obs_A Obs_B Obs_C time
# <int> <chr> <dbl> <dbl> <dbl> <dbl> <int>
#1 1 male 91 0.333 0.333 0 3
#2 2 female 88 0 0.667 0.667 3
#3 3 male 51 0.333 0.333 0 3
#4 4 female 55 0 1 0 3
由于您按所有字符列进行分组,因此无需将它们包含在 across
中。
正如 OP 提到的关于使用 regex
,一个选项是 matches
,与 starts_with
或 end_with
或 contains
相比,它可以采用正则表达式。此外,我们不需要使用 ungroup
,因为 summarise
中有一个选项来指定 .groups
,即即使我们在 ungroup
之后使用 summarise
,如果我们指定 .groups
library(dplyr)
TTE %>%
group_by(id,across(matches('^[Oo]bs'),max),.groups = 'drop')
-输出
# A tibble: 4 x 7
id sex Age Obs_A Obs_B Obs_C time
<int> <chr> <dbl> <dbl> <dbl> <dbl> <int>
1 1 male 91 0.333 0.333 0 3
2 2 female 88 0 0.667 0.667 3
3 3 male 51 0.333 0.333 0 3
4 4 female 55 0 1 0 3
请注意,where
主要用于检查列的值而不是列名。为此,我们需要使用 select-helpers
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。