2017-06-30 11 views
1

私は私は、この他の1したがってreshape2でユーザー定義関数内の変数を呼び出す::溶融し、reshape2 :: dcast

output <- data.frame(color=c("red","green","blue"),units_box=c(1,4,7),price_box=c(11.5,14.5,17.5), units_chair=c(2,5,8),price_chair=c(12.5,15.5,18.5),units_table=c(3,6,9),price_table=c(13.5,16.5,19.5)) 

に、このデータフレーム

data <- data.frame(color=c("red","red","red","green","green","green","blue","blue","blue"),object=c("box","chair","table","box","chair","table","box","chair","table"),units=c(1:9),price=c(11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5)) 

を変換したいです私が使用している場合、次の

fun<-function(df,var,group){ 
    r<-reshape2::melt(df,id.vars=var) 
    r<-reshape2::dcast(r,var~group) 
return(r) 
} 

として、ユーザー定義関数を作成することreshape2::meltreshape2::dcastを使用して機能

楽しさを次のように(データ、色、オブジェクト)

私は次のエラーメッセージmelt_checkで

エラー(データ、id.vars、measure.vars、variable.name、 を取得value.name):オブジェクト 'color'が見つかりません

どうすれば解決できますか?私は問題は私が引用符でreshape2::meltの変数を呼び出す必要がありますが、私はどのようにわからないと思う。

注1:私は、変数の元の数の書式を維持したいと思います(すなわち、1つの小数と小数と価格のないオブジェクト)

注2:私はそれが私の実際のコード(これは単にであることを発言したいと思います簡略化された例)ははるかに長く、dplyr関数(enquo()関数とUQ()関数を含む)を含みます。したがって、この場合の解決策はdplyrと互換性があります。

注3:現在のtidyrはまだ機能のために古い言語を使用しているため、私はtidyrを使用しません(私は全面的に大変です)。私はこのスクリプトを他の人と共有します。開発バージョンはtidyrです。 (私は背後にある非常によく理由はわかりませんが)

答えて

0

からdcastを使用することができます。 主な問題は、ユーザー定義関数の変数をメルトとdcastに渡していると思われたように、引用符(?)の不足のために何らかの矛盾が発生する可能性があります。 とにかく、dplyr :: renameを使って変数の名前を変更し、名前が変数ではなく文字に依存するようにしました。ここでは、私が適用しています最終的なコードを見ることができます:誰かが背後にある私にその理由を説明している場合

fun<-function(df,var,group){ 
    enquo_var<-enquo(var) 
    enquo_group<-enquo(group) 

    r<-df%>% 
    reshape2::melt(., id.var=1, variable.name = "parameter")%>% 
    dplyr::rename(var = UQ(enquo_var))%>% 
    reshape2::dcast(data=., formula = var~parameter, value.var = "value") 

return(r) 
} 

funx<-fun(data,color,object) 

私は私の特定の問題への解決策を見つけたが、私は非常に感謝します。

PS:新しいバージョンのtidyrがすぐにそのような作業を容易にすることを願っています。あなたの素晴らしい仕事のために@ハドリーに感謝します。

2

私たちは、私が自分で問題を解決しdata.table

library(data.table) 
dcast(setDT(data), color ~object, value.var = c("units", "price"), FUN = c(length, mean)) 
+0

アイデアのおかげでありがとう、私は同じエラーメッセージ 'melt.data.table(df、id.vars = var)のエラー:オブジェクト '色'が見つかりません' <-function(df、var、group){ r <-reshape2 :: melt(df、id.vars = var) r <-dcast(setDT(r)、color〜object、value)するvar = cで( "ユニット"、 "価格")、FUN = C(長さ、平均値)) リターン(R) } 楽しい(データ、色、オブジェクト) ' – ungatoverde

+0

@ungatoverde私はエラーを取得しておりません'data.table_1.10.5'を使ってあなたの例を使ってください。関数に基づいて、' fun'の 'data'はどこにありますか?私はあなたがオブジェクト 'r'を作成したのを見る – akrun

+0

申し訳ありませんが、あなたは正しいです。以前のコメントに間違いがありました。私はちょうどそれを修正した。また、data.tableの適切な関数名を追加します: \t 'fun <-function(df、var、group){r <-data.table :: melt.data.table(df、id.vars = var) r <-data.table :: dcast.data.table(setDT(r)、color〜object、value.var = c(「単位」、「価格」)、FUN = c(長さ、平均) リターン(データ、色、オブジェクト) 'と同じエラーメッセージ:-( – ungatoverde

関連する問題