我有一个看起来像这样的数据框
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
看起来这是一个反向重塑,但我不知道该使用什么
提前感谢。
答案 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])}))