2016-08-18 7 views
0

列1の係数変数と列2以降の年単位のデータを使用して、ワイドフォーマットのデータフレームのリストを持っています。私はこれらのデータをグラフにしたい。これを行うには、長い形式に整形する必要があります。入力用のオブジェクトを使用して、幅広い形から長形に変更する

# SAMPLE DATA 
x <- structure(list(State = structure(1:3, .Label = c("Alabama", "Alaska", "Arizona", "Arkansas"), class = "factor"), Green.And.Blue.Score.2001 = c(0L, 40L, 65L), Green.And.Blue.Score.2002 = c(20L, 5L, 60L), Green.And.Blue.Score.2003 = c(35L, 15L, 30L)), .Names = c("State", "Green.And.Blue.Score.2001", "Green.And.Blue.Score.2002", "Green.And.Blue.Score.2003"), row.names = c(NA, 3L), class = "data.frame") 

x 
# State Green.And.Blue.Score.2001 Green.And.Blue.Score.2002 Green.And.Blue.Score.2003 
#1 Alabama   0       20       35 
#2 Alaska   40       5       15 
#3 Arizona   65       60       30 

私は通常、このreshape()を使用してください:ここで1つのデータフレームの例があります。例えば、これは正常に動作します:

# RESHAPE WIDE TO LONG (MANUALLY) 
y <- reshape(x, 
    idvar = 'State', 
    varying = c('Green.And.Blue.Score.2001', 'Green.And.Blue.Score.2002', 'Green.And.Blue.Score.2003'), 
    v.names = 'Green.And.Blue.Score.', 
    times = c('2001', '2002', '2003'), 
direction = 'long') 

y 
# State time Green.And.Blue.Score. 
# Alabama 2001  0 
# Alaska 2001  40 
# Arizona 2001  65 
# Alabama 2002  20 
# Alaska 2002  5 
# Arizona 2002  60 
# Alabama 2003  35 
# Alaska 2003  15 
# Arizona 2003  30 

しかし、私は手動で入力するidvarvaryingv.name、そして私が持っているデータフレームの数十のためtimes変数、およびいくつかのためを持っている必要はありませんでした列名はかなり長くて複雑であり、データフレームからデータフレームまでかなり変化します。単純なreshape()コマンドはそれらを自動的に解読できません。私の考えは以下の通りの前駆体である、データフレームからそれらの入力を得るために、関数を作成することであった。

# RESHAPE WIDE TO LONG (FUNCTIONALIZED) 
id <- noquote(paste("'", names(x[1]), "'", sep = "")) 
va <- noquote(paste("c('", paste(names(x)[2:length(x)], collapse = "', '"), "')", sep = "")) 
vn <- noquote(paste("'", sub("(\\..*)$", ".", names(x)[2]) , "'", sep = "")) 
ti <- noquote(paste("c('", paste(sub(".*(\\d{4})$", "\\1", names(x[2:length(x)])), collapse = "', '"), "')", sep = "")) 

これらのマッチの各idvarvaryingv.name、そして#RESHAPE WIDE TO LONG (MANUALLY)からtimes入力の出力上記:

id 
# 'State' 
va 
# c(''Green.And.Blue.Score.2001', ''Green.And.Blue.Score.2002', ''Green.And.Blue.Score.2003') 
vn 
# ''Green.And.Blue.Score.' 
ti 
# c('2001', '2002', '2003') 

しかし、私はreshape()機能でこれらのオブジェクトを使用しようとすると、私はエラーメッセージが表示されます:

y <- reshape(x, 
    idvar = id, 
    varying = va, 
    v.names = vn, 
    times = ti, 
direction = 'long') 

Error in [.data.frame(data, , varying[[i]][1L]) : undefined columns selected

「functionalizeする」という私の解決策は理想的ではありません。代わりに私は何をしなければなりませんか?

+0

'noquote'関数はRを生成しません。あなたが期待しているように見える表現。これは、まだ文字値であるクラスnoquoteの項目を返しますが、それは異なるprint-to-consoleメソッドを持ちます。それを囲む 'paste'-ng引用符はさらに混乱を招くでしょう。 –

答えて

2

名前から抽出されたマテリアルを引用符で囲んでみると、エラーが発生しています。これはそのコードの単純化です。列名が "。"で正しく区切られている場合、自動的に計算されるので、v.namesとtimesを削除したことに注意してください。

y <- reshape(x, 
    idvar = names(x)[1], 
    varying = names(x)[-1], 

direction = 'long') 
y 
#-----  
      State time Score 
Alabama.2001 Alabama 2001  0 
Alaska.2001 Alaska 2001 40 
Arizona.2001 Arizona 2001 65 
Alabama.2002 Alabama 2002 20 
Alaska.2002 Alaska 2002  5 
Arizona.2002 Arizona 2002 60 
Alabama.2003 Alabama 2003 35 
Alaska.2003 Alaska 2003 15 
Arizona.2003 Arizona 2003 30 

新しい例でこれを使用すると、妥当な結果をもたらす ".S"に "分割"が得られます。列名の最初の期間の間のテキストおよび主要な状態名と年がrownameとして一緒にappeanded取得しながら、「分割」のパターンは、列名に移動します:

y <- reshape(x, 
     idvar = names(x)[1], 
    varying = names(x)[-1], 
    split = list(regexp = "\\.S", include = TRUE), 
    direction = 'long') 
    y 

        State  time Green.And.Blue. 
Alabama.Score.2001 Alabama Score.2001    0 
Alaska.Score.2001 Alaska Score.2001    40 
Arizona.Score.2001 Arizona Score.2001    65 
Alabama.Score.2002 Alabama Score.2002    20 
Alaska.Score.2002 Alaska Score.2002    5 
Arizona.Score.2002 Arizona Score.2002    60 
Alabama.Score.2003 Alabama Score.2003    35 
Alaska.Score.2003 Alaska Score.2003    15 
Arizona.Score.2003 Arizona Score.2003    30 
+0

ありがとうございます@ 42-、私は私のサンプルデータをあまりにも単純化したと思います。私の実際のデータの変数名は 'Score.2001'の代わりにもう少し複雑で、' Green.And.Blue.Score.2001'に似ていて、それらの変数名はそれぞれのデータフレームの長さがかなり異なります(ただし、常に4桁で終了します)。だから私は上記の単純化されたコードを実行すると、私はこのエラーが発生します: '推測のエラー(変化):'名前から時変変数を推測するのに失敗しました。 'noquote()'より長い変数名でOPを更新する必要がありますか? – coip

+1

言い換えれば、はい。 '?reshape'を見ると、より複雑なケースを処理するための正規表現を構築できることに気付くでしょう。別の場合には、最後に分割される正規表現を構築することが可能でなければなりません。 " –

関連する問題