2016-08-05 6 views
1

行IDとしてベクトル名と、データフレームの中に文字ベクトルを組み合わせる:Rは、私は3つの文字ベクトル持っ

blue <-c("Ti","Ka","Vv","Cn") 
Turq <-c("Cc","Wx","Oq","Yt") 
Indigo <-c("Gb","Ap") 

を、彼らはこのように見えるように、私は1つのデータフレームにそれらを結合したい:

blue Ti 
blue Ka 
blue Vv 
blue Cn 
Turq Cc 
Turq Wx 
Turq Oq 
Turq Yt 
Indigo Gb 
Indigo Ap 

私は方法を見つけることができないようです。

答えて

3

あなたが名前のリストにベクトルを配置し、stackを使用することができます。

lst <- list(blue = blue, Turq = Turq, Indigo = Indigo) 
lst 
# $blue 
# [1] "Ti" "Ka" "Vv" "Cn" 

# $Turq 
# [1] "Cc" "Wx" "Oq" "Yt" 

# $Indigo 
# [1] "Gb" "Ap" 

stack(lst) 
# values ind 
#1  Ti blue 
#2  Ka blue 
#3  Vv blue 
#4  Cn blue 
#5  Cc Turq 
#6  Wx Turq 
#7  Oq Turq 
#8  Yt Turq 
#9  Gb Indigo 
#10  Ap Indigo 
+1

また、 'stack(mget(ls()))'のように手動で名前を付ける代わりに 'mget'を使うだけです –

0

これはあまり効率的ではありませんが、仕事を完了します。

blue <-c("Ti","Ka","Vv","Cn") 
Turq <-c("Cc","Wx","Oq","Yt") 
Indigo <-c("Gb","Ap") 

#assumes no duplicates in the original vectors. 
df<-as.data.frame(cbind(blue, Turq, Indigo)) 

library(tidyr) 
df<-unique(gather(df)) 

これにより警告が表示されますが、要求された結果が得られます。すべてのベクトルが同じ長さになるようにベクトルを繰り返すcbind。

+0

'data.frame(cbind(...))'に入るのは良い習慣ではありません。単に 'data.frame(blue、Turq、Indigo)'だけではないのですか? – thelatemail

+0

長さが異なるため、エラーが発生します。 – Dave2e

+0

いいえ、エラーはありません。そして 'cbind'は' data.frame'と同じ 'Indigo'の繰り返しを行います。 'equal(data.frame(blue、Turq、Indigo)、as.data.frame(cbind(blue、Turq、Indigo))))' – thelatemail

0

試してみてください。

df<-data.frame(blue,Turq,Indigo) 
library(reshape) 
unique(melt(cbind(1:nrow(df),df),id=1)[,-1]) 

    variable value 
1  blue Ti 
2  blue Ka 
3  blue Vv 
4  blue Cn 
5  Turq Cc 
6  Turq Wx 
7  Turq Oq 
8  Turq Yt 
9 Indigo Gb 
10 Indigo Ap 
0

我々はlistにベクトルを配置した後meltを使用することができます。

library(reshape2) 
melt(mget(c("blue", "Turq", "Indigo")))[2:1] 
#  L1 value 
#1 blue Ti 
#2 blue Ka 
#3 blue Vv 
#4 blue Cn 
#5 Turq Cc 
#6 Turq Wx 
#7 Turq Oq 
#8 Turq Yt 
#9 Indigo Gb 
#10 Indigo Ap 
関連する問題