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