将列名转换为R中的行

时间:2014-11-28 09:15:02

标签: r 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

看起来这是一个反向重塑,但我不知道该使用什么

提前感谢。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

您还可以使用stack

中的base R
 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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

没有外部包装就可以这样做。

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