在R中将列名转换为行

2cmtqfgy  于 2023-05-04  发布在  其他
关注(0)|答案(5)|浏览(131)

我有一个 Dataframe ,看起来像这样

v1 <- c(1,2,3,4,5,6)
v2 <- c(2,3,4,3,5,1)
group <- c("A","B","C","D","E","G")

df1 <- data.frame(v1,v2,group)

v1  v2  group
1   2    A
2   3    B
3   4    C
4   3    D
5   5    E
6   1    G

我想把它变成这样

v   sale    group
v1     2    A
v1     3    B
v1     4    C
v1     3    D
v1     5    E
v1     1    G
v2     1    A
v2     2    B
v2     3    C
v2     4    D
v2     5    E
v2     6    G

这好像是一个反向重塑,但我不知道用什么
先谢谢你。

f0brbegy

f0brbegy1#

library(reshape)
v1 <- c(1,2,3,4,5,6)
v2 <- c(2,3,4,3,5,1)
group <- c("A","B","C","D","E","G")
df1 <- data.frame(v1,v2,group)
melt(df1)

   group variable value
1      A       v1     1
2      B       v1     2
3      C       v1     3
4      D       v1     4
5      E       v1     5
6      G       v1     6
7      A       v2     2
8      B       v2     3
9      C       v2     4
10     D       v2     3
11     E       v2     5
12     G       v2     1
5ktev3wc

5ktev3wc2#

使用tidyr的另一个选项:

library(tidyr)

gather(df1, v, Sale, v1:v2)

#   group     v Sale
#1      A    v1    1
#2      B    v1    2
#3      C    v1    3
#4      D    v1    4
#5      E    v1    5
#6      G    v1    6
#7      A    v2    2
#8      B    v2    3
#9      C    v2    4
#10     D    v2    3
#11     E    v2    5
#12     G    v2    1
siv3szwd

siv3szwd3#

也可以使用base R中的stack

cbind(setNames(stack(df1[,-3]),c('sale','v')), group=df1$group)
 #    sale  v group
 #1     1 v1     A
 #2     2 v1     B
 #3     3 v1     C
 #4     4 v1     D
 #5     5 v1     E
 #6     6 v1     G
 #7     2 v2     A
 #8     3 v2     B
 #9     4 v2     C
 #10    3 v2     D
 #11    5 v2     E
 #12    1 v2     G
s1ag04yj

s1ag04yj4#

不需要外 Package 就可以这样做。

do.call(rbind,apply(df1,1,function(x){data.frame(v=names(x)[1:2],sale=unlist(x[1:2]),group=x[3])}))
  • 该函数将原始 Dataframe 的一行重写为具有所需结构的新 Dataframe 。
  • 应用程序将构建这些新 Dataframe 的列表,并
  • www.example.com 将那些多个 Dataframe 合并为新的 Dataframe 。
fnx2tebb

fnx2tebb5#

Tidyverse解决方案:

library(tidyverse)

v1 <- c(1,2,3,4,5,6)
v2 <- c(2,3,4,3,5,1)
group <- c("A","B","C","D","E","G")

df1 <- data.frame(v1,v2,group)

df1_long <- df1 %>%
  pivot_longer(cols = v1:v2, names_to = "v", values_to = "sale")

相关问题