Как использовать tidyr pivot_longer, когда cols = любой столбец, который начинается с определенного префикса - PullRequest
1 голос
/ 26 февраля 2020

Каждую неделю я получаю необработанный набор данных, из которого мне нужно составить отчет. Я хотел бы написать один скрипт 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_longer:

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_longer, который будет работать на w1 , w2 и w3 ? (отредактировано для включения w3 - см. ниже)

Я пытался (выберите (., Start_with ("женщины")), но не могу понять правильный синтаксис. Документация pivot_longer упоминает names_pattern () и extract (), которые кажутся многообещающими, но я не знаю, как их использовать. Спасибо!

EDIT : в ответ на ответ Акруна я понял, что у меня есть предоставить немного более сложные примеры данных. Код также должен работать со столбцом, который иногда появляется в наборах данных, называемых «неизвестный пол», например:

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

1 Ответ

1 голос
/ 26 февраля 2020

Обычные столбцы являются «видами», поэтому мы можем использовать -

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...