2014-11-25 96 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