【问题标题】:Gathering data frame from wide to long and generating a new column using tidyverse in R从宽到长收集数据帧并使用 R 中的 tidyverse 生成新列
【发布时间】:2020-03-20 02:42:36
【问题描述】:

我的数据如下:

df1<-read.table(text=" A	A1	B	B1	C	C1
12	7	11	4	16	9
12	6	13	8	12	7
14	6	14	2	11	5
13	5	14	3	10	6
11	4	15	6	9	4
10	3	16	7	`8	3
9	2	18	4	`12	12",header=TRUE)

我希望得到以下结果。为了节省空间,我没有生成其余部分,因为我觉得可能没有必要

Group	Time	Value
M	A	12
N	A1	7
M	B	11
N	B1	4
M	C	16
N	C1	9
M	A	12
N	A1	6
M	B	13
N	B1	8
M	C	12
N	C1	7
M	A	14
N	A1	6
M	B	14
N	B1	2
M	C	11
N	C1	5
.	.	.
.	.	.
.	.	.
.	.	.

我所做的是:

df2&lt;-gather(df1,Group, Time)

A、B、C 归类为 M,A1、B1 和 C1 归类为 N。有人可以帮忙吗?

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    试试这个:

    df1<-read.table(text=" A    A1  B   B1  C   C1
    12  7   11  4   16  9
    12  6   13  8   12  7
    14  6   14  2   11  5
    13  5   14  3   10  6
    11  4   15  6   9   4
    10  3   16  7   8   3
    9   2   18  4   12  12",header=TRUE)
    
    df2 = gather(df1)
    
    df2$Group = ifelse(grepl('\\d', x = df2$key), 'N', 'M')
    

    相应地更改列名。

    结果:

    > df2
       key value Group
    1    A    12     M
    2    A    12     M
    3    A    14     M
    4    A    13     M
    5    A    11     M
    6    A    10     M
    7    A     9     M
    8   A1     7     N
    9   A1     6     N
    10  A1     6     N
    11  A1     5     N
    12  A1     4     N
    13  A1     3     N
    ...
    

    【讨论】:

    • 问题是 A、A1、B、B1 ... 是假设的,如果我有其他列名,这些代码不起作用。
    • 为什么投反对票?它与其他答案相同(从这里复制)
    • @R.Schifini 声称所有答案都是从你那里复制的并不是最聪明的事情,尤其是当你查看时间戳时
    【解决方案2】:

    您可以使用if_else 创建一个额外的列:

    library(dplyr)
    library(tidyr)
    group1 <- names(df1)[grepl(".+1$", names(df1))]
    df <- tidyr::gather(df1, Time, Value) %>%
      dplyr::mutate(Group = if_else(Time %in% group1, "N", "M"))
    

    之后,您可以按照自己喜欢的方式排列行和列。

    输出

    Time Value Group
    1     A    12     M
    2     A    12     M
    3     A    14     M
    4     A    13     M
    5     A    11     M
    6     A    10     M
    7     A     9     M
    8    A1     7     N
    9    A1     6     N
    10   A1     6     N
    11   A1     5     N
    12   A1     4     N
    13   A1     3     N
    14   A1     2     N
    15    B    11     M
    ...
    

    【讨论】:

    • 那么你必须澄清你的问题,以明确你想要实现的目标。例如,如何将变量分配给组。 1在变量名中的作用是什么?
    【解决方案3】:

    如果您想让Group 以“1”结尾(其余为M)为N,您可以执行以下操作:

    library(tidyverse)
    
    df1 %>%
      pivot_longer(cols = everything(), names_to = "Time", values_to = "Value") %>%
      mutate(Group = if_else(endsWith(Time, "1"), "N", "M"))
    

    建议使用pivot_longer 代替gather 和最新的tidyr,作为其替代品。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2021-12-01
      相关资源
      最近更新 更多