r-当cols=以某个前缀开头的任何列时,如何使用tidyr pivot_langer



每周,我都会得到一个原始数据集,我需要从中生成一个报告。我想写一个R脚本,每周都能用。不幸的是,根据采集的样本,原始数据每周的列组略有不同。下面是一个每周的例子。

library(readr)
w1 <- read_csv("species, males, females - fed, females - unfed
a,2,0,3
b,5,7,2
c,8,4,9")
w2 <- read_csv("species, males, females - mixed
a,2,0
b,5,7
c,8,4")
> w1
# A tibble: 3 x 4
species males `females - fed` `females - unfed`
<chr>   <dbl>           <dbl>             <dbl>
1 a           2               0                 3
2 b           5               7                 2
3 c           8               4                 9
> w2
# A tibble: 3 x 3
species males `females - mixed`
<chr>   <dbl>             <dbl>
1 a           2                 0
2 b           5                 7
3 c           8                 4

以下是我通常使用pivot_langer:的方式

library(tidyr)
w1 %>% pivot_longer(cols = c(males, `females - fed`, `females - unfed`),
names_to = c("sex","feeding_status"),
names_sep = " - ",
values_to = "quantity")
# A tibble: 9 x 4
species sex     feeding_status quantity
<chr>   <chr>   <chr>             <dbl>
1 a       males   NA                    2
2 a       females fed                   0
3 a       females unfed                 3
4 b       males   NA                    5
5 b       females fed                   7
6 b       females unfed                 2
7 c       males   NA                    8
8 c       females fed                   4
9 c       females unfed                 9

如何为pivot_langer编写适用于w1w2w3的代码?(编辑为包含w3--请参阅下文(

我试过(select(.,starts_with("females"((,但找不出正确的语法。pivot_langer文档提到了names_pattern((和extract((,它们看起来很有前景,但我不知道如何使用它们。非常感谢。

EDIT:响应akrun的回答,我意识到我必须提供稍微复杂一点的样本数据。该代码还需要处理一个偶尔出现在数据集中的名为"未知性别"的列,比如:

w3 <- read_csv("species, males, females - mixed, unknown sex
a,2,0,4
b,5,7,0
c,8,4,23")
> w3
# A tibble: 3 x 4
species males `females - mixed` `unknown sex`
<chr>   <dbl>             <dbl>         <dbl>
1 a           2                 0             4
2 b           5                 7             0
3 c           8                 4            23

akrun在下面建议的地址w1和w2的代码导致w3:的"未知性别"列中的值加倍

w3 %>%
pivot_longer(cols = c(males, starts_with('females')),
names_to = c("sex", "feeding_status"), names_sep=" - ")
# A tibble: 6 x 5
species `unknown sex` sex     feeding_status value
<chr>           <dbl> <chr>   <chr>          <dbl>
1 a                   4 males   NA                 2
2 a                   4 females mixed              0
3 b                   0 males   NA                 5
4 b                   0 females mixed              7
5 c                  23 males   NA                 8
6 c                  23 females mixed              4

常见的列是"物种",因此我们可以使用-

library(dplyr)
library(tidyr)
w1 %>% 
pivot_longer(cols = -species, 
names_to = c("sex","feeding_status"),
names_sep = " - ",
values_to = "quantity")

select_helpers之一

w1 %>%
pivot_longer(cols = c(males, starts_with('females')),
names_to = c("sex", "feeding_status"), names_sep=" - ")
# A tibble: 9 x 4
#  species sex     feeding_status value
#  <chr>   <chr>   <chr>          <dbl>
#1 a       males   <NA>               2
#2 a       females fed                0
#3 a       females unfed              3
#4 b       males   <NA>               5
#5 b       females fed                7
#6 b       females unfed              2
#7 c       males   <NA>               8
#8 c       females fed                4
#9 c       females unfed              9

如果我们想包括多个案例,那么matches在另一个选项中

w3 %>% 
pivot_longer(cols = c(males, matches('^(females|unknown)')), 
names_to = c("sex", "feeding_status"), names_sep=" - ")
# A tibble: 9 x 4
#  species sex         feeding_status value
#  <chr>   <chr>       <chr>          <dbl>
#1 a       males       <NA>               2
#2 a       females     mixed              0
#3 a       unknown sex <NA>               4
#4 b       males       <NA>               5
#5 b       females     mixed              7
#6 b       unknown sex <NA>               0
#7 c       males       <NA>               8
#8 c       females     mixed              4
#9 c       unknown sex <NA>              23

最新更新