从宽到长收集数据框,并在 R 中使用 tidyverse 生成新列

  • 本文关键字:tidyverse 新列 并在 数据 r tidyverse
  • 更新时间 :
  • 英文 :


我的数据如下:

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<-gather(df1,Group, Time)

A、B、C 被分类为 M,A1、B1 和 C1 被归类为 N。谁能帮忙?

如果你想让GroupN如果以"1"结尾(其余M(,你可以执行以下操作:

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作为替代品。

您可以使用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
...

试试这个:

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
...

最新更新