2016-11-04 8 views
0

私は答えを見回し、解決策を考え出していません。Rデータフレームで1列を複数の列に分割する方法

私は(サンプル努力の単位)データフレームに単一の列で私のデータフレームの倍数(〜60)の列(種数)を分割しようとしています

私は解決策を考え出すことができました私が好むよりも面倒です。今書いているように、私は間違ってコードの最後の行を2回実行し、2回に分割して値を混乱させる可能性があります。

ここでは、私が使用したソリューションを示す簡単な例を示します。何かクリーナーの提案?

#short data.frame with some count data 
#Hours is the sampling effort 


counts=data.frame(sp1=sample(1:10,10),sp2=sample(1:10,10), 
     sp3=sample(1:10,10),sp4=sample(1:10,10), 
     Hours=rnorm(10,4,1)) 


#get my 'species' names 
names=colnames(counts)[1:4] 

#This seems messy: and if I run the second line twice, I will screw up my values. I want to divide all 'sp' columns by the single 'Hours' column 

rates=counts 
rates[names]=rates[,names]/rates[,'Hours'] 

PS:私は、%>%でパイピングされてきた、と誰もが、私はちょうど新しいdata.frameを作成せずに「数」data.frameを変換できるソリューションを持っているのであれば、それはうねりになります!

私は(例えば。mutate_each?)ハドレーの機能の一つは、私が必要なものを持っていることが疑われるPSSが、私はそれを把握することができていない。..

+0

が、これは '数は%>%mutate_each(低速運行(./時間)、-hours)' – agenis

+0

しかし、あなたはすぐそこにISNしているしてみてください'mutate_each'のヘルプファイルの一例です – agenis

+5

あなたの例にとって重要でない限り、' rm(list = ls()) 'のようなコードを投稿しないでください。誰かが誤ってコピー/ペーストして実行してしまうようなものではありません。 – Gregor

答えて

2

私は本当にあなたと間違っている何が表示されませんベースRのアプローチ、それは非常にきれいです。誤って最初の行を実行せずに2行目を何度も実行することを心配している場合は、元のcounts列を以下のように参照してください。私はこのようにそれを行うために小さな調整を行うことになります。[[[を使用して

rates = counts 
rates[names] = counts[names]/counts[["Hours"]] 

は関係なく、namesの長さのデータ型を保証します。

私はdplyr好きですが、それはこのために乱雑だ:

# This works if you want everything except the Hours column 
rates = counts %>% mutate_each(funs(./Hours), vars = -Hours) 

# This sort of works if you want to use the names vector 
rates = counts %>% mutate_at(funs(./Hours), .cols = names) 
+0

opの答え+私の素晴らしい組み合わせ – agenis

関連する問題