如何将两种列分组为两列

时间:2021-03-04 15:40:55

标签: r dplyr tidyr

我下载了格式复杂的数据,我正在努力使其整洁。数据框包含来自多次采样的数据,对于每次采样,它提供两列,一列表示携带年份,另一列表示获得的数字。 这是一个具有相同结构的虚拟数据集:

df<-data.frame(s1y=c(2000,2001,2002),
               s1r=c(5,23,5),
               s2y=c(2004,2004,2003),
               s2r=c(6,2,3),
               s3y=c(2009,2008,2006),
               s3r=c(4,2,12))

   s1y s1r  s2y s2r  s3y s3r
1 2000   5 2004   6 2009   4
2 2001  23 2004   2 2008   2
3 2002   5 2003   3 2006  12

列名中,数字代表采样次数,“y”和“r”分别代表年份和结果。 我真的不在乎采样;我想要两列,一列代表年份,另一列代表结果,所以它看起来像这样:

     y  r
1 2000  5
2 2001 23
3 2002  5
4 2004  6
5 2004  2
6 2003  3
7 2009  4
8 2008  2
9 2006 12

我一直在尝试使用 pivot_longer() 来做到这一点,但我不知道如何同时将其转换为两个长列,而且我还尝试将其折叠为这样的一列

df%>%pivot_longer(cols=everything(),
                     names_pattern="(..)(.)",
                     names_to=c("sampling","type"),
                     values_to="result")

然后使用 pivot_wider(),但我无法获得所需的输出。

1 个答案:

答案 0 :(得分:1)

这个怎么样?如果您的数据是一致的(只有 yr),那么您需要一个每两行更改一次的 id_col

df %>%
  pivot_longer(cols = everything(),
               names_pattern="(..)(.)",
               names_to=c("sampling","type"),
               values_to = "result"
  ) %>%
  mutate(id_col = row_number() + row_number() %% 2) %>%
  pivot_wider(id_cols = "id_col",
              names_from = "type",
              values_from = "result"
  )