2014-11-25 58 views
2

如何查找值R中,我有一个数据帧 这是基于行和列

name val1 val2 
A  2 3 
B  5 6 
C  7 9 

我希望有一个数据帧

name Grp value 
A val1 2 
B val1 5 
C val1 7 
A val2 3 
B val2 6 
C val2 9 

什么是最佳的解决方案?

+1

你是如何定义 “最佳解决方案”? – A5C1D2H2I1M1N2O1R2T1 2014-11-25 14:47:59

回答

3

它被称为从宽到长的格式重塑一个data.frame。一个选择这样做会使用包tidyr

library(tidyr) 

gather(df, Grp, Value, -name) 
# name Grp Value 
#1 A val1  2 
#2 B val1  5 
#3 C val1  7 
#4 A val2  3 
#5 B val2  6 
#6 C val2  9 
3

或者只是使用meltreshape2

library(reshape2) 
melt(df) 
# name variable value 
# 1 A  val1  2 
# 2 B  val1  5 
# 3 C  val1  7 
# 4 A  val2  3 
# 5 B  val2  6 
# 6 C  val2  9 

编辑:每@AnandaMahtos评论,如果你坚持有你variable名称Grp,您可以选择:

melt(df, variable.name = "Grp") 
+0

@AnandaMahto,够公平的,我没有注意到他希望他的变量被称为'Grp' – 2014-11-25 14:54:45

1

一个base R选项是使用stack

cbind(name=df$name, stack(df, select=-name)) 
# name values ind 
#1 A  2 val1 
#2 B  5 val1 
#3 C  7 val1 
#4 A  3 val2 
#5 B  6 val2 
#6 C  9 val2 
1

或没有任何额外的包:

ddff<- data.frame(name=c("A","B","C"),val1=c(2,5,7),val2=c(3,6,9)) 
ddff2<- reshape(ddff,direction="long", varying = list(names(ddff)[2:3]),v.names=c("values"),times=c("val1","val2"))[,1:3] 

ddff2 
#  name time values 
#1.val1 A val1  2 
#2.val1 B val1  5 
#3.val1 C val1  7 
#1.val2 A val2  3 
#2.val2 B val2  6 
#3.val2 C val2  9