每周,我都会得到一个原始数据集,我需要从中生成一个报告。我想写一个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编写适用于w1、w2和w3的代码?(编辑为包含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