【问题标题】:How to group two kinds of columns into two columns如何将两种列分组为两列
【发布时间】:2021-03-04 15:40:55
【问题描述】:

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

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(),但我无法获得所需的输出。

【问题讨论】:

  • 列名的命名结构和你提供的dummydata一样吗?
  • 非常相似但不完全相同,它们看起来像 E05MTS 和 E05YOE,其中 E05 表示它是采样 05,而 MTS/YOE 区分结果/年。我知道这个更改对 pivot_longer 中 names_pattern 的使用有影响,但为了简单起见,我将其缩短了。

标签: r dplyr tidyr


【解决方案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"
  ) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2021-12-29
    • 2015-08-21
    • 2023-02-21
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多