繁体   English   中英

将矩阵转换为两列

[英]Transform a matrix to two columns

我有一个包含三列的表格,如下所示

第 1 组 第 2 组 第 3 组
1个 2个 3个
5个 21 32
10 32 50
12 20 60

我想将其转换为如下所示的矩阵

价值 团体
1个 第 1 组
5个 第 1 组
10 第 1 组
12 第 1 组
2个 第 2 组
21 第 2 组
32 第 2 组
20 第 2 组
3个 第 3 组
32 第 3 组
50 第 3 组
60 第 3 组

我如何在 R 中执行此操作?

使用 base R,您可以使用:

> dt <- data.frame(Group1 = c(1,5,10,12), Group2 = c(2, 21, 32, 20), Group3 = c(3, 32, 50, 60))
> dt
  Group1 Group2 Group3
1      1      2      3
2      5     21     32
3     10     32     50
4     12     20     60
> as.data.frame(cbind(unlist(dt, use.names = FALSE), rep(names(dt), each = nrow(dt))))
   V1     V2
1   1 Group1
2   5 Group1
3  10 Group1
4  12 Group1
5   2 Group2
6  21 Group2
7  32 Group2
8  20 Group2
9   3 Group3
10 32 Group3
11 50 Group3
12 60 Group3

编辑:解决上面的V1列是 class 字符的问题。 相反,如果这需要是数字,那么我们可以这样做:

dt1 <- as.data.frame(cbind(unlist(dt, use.names = FALSE), rep(names(dt), each = nrow(dt))))
dt1$V1 <- as.numeric(dt1$V1)

或者,简单地说:

stack(dt)

根据@markus 的评论

使用熔体:

library(data.table)
dat <- as.data.table(matrix)
melt(dat, measure.vars = names(dat))

另一种使用dplyr的方法:

dat <- read.table(text = "Group1    Group2  Group3
 1  2   3
 5  21  32
 10 32  50
 12 20  60", header = TRUE)
dat
#   Group1 Group2 Group3
# 1      1      2      3
# 2      5     21     32
# 3     10     32     50
# 4     12     20     60

newdat <- dat %>% pivot_longer(cols = 1:3, 
                               names_to = "Group", 
                               values_to = "Value") %>% 
                  arrange(Group) %>% 
                  relocate(Value)
newdat

# A tibble: 12 x 2
# Value Group 
# <int> <chr> 
# 1     1 Group1
# 2     5 Group1
# 3    10 Group1
# 4    12 Group1
# 5     2 Group2
# 6    21 Group2
# 7    32 Group2
# 8    20 Group2
# 9     3 Group3
# 10    32 Group3
# 11    50 Group3
# 12    60 Group3

随着tidyr

library(tidyr)

data%>% 
gather(Value, Group) %>% 
relocate(Value, .after = Group)

Output:

       Group  Value
1      1 Group1
2      5 Group1
3     10 Group1
4     12 Group1
5      2 Group2
6     21 Group2
7     32 Group2
8     20 Group2
9      3 Group3
10    32 Group3
11    50 Group3
12    60 Group3

样本数据:

data <- read.table(text = "Group1    Group2  Group3
 1  2   3
 5  21  32
 10 32  50
 12 20  60", header = TRUE)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM