2016-11-04 153 views
0

我環顧四周尋找答案,並沒有完全想出解決方案。如何在R數據框中將一列分成多列

我試圖劃分多個(〜60),通過在數據幀中的單個列(樣本努力單元)

我的數據幀(種數)的列我能拿出解決方案下面 - 但它比我想要的更混亂。正如現在寫的,我可能會意外地運行最後一行代碼兩次,並通過分割兩次來弄亂我的值。

下面是一個簡短的例子,我演示了我使用的解決方案。任何建議更清潔的東西?

#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,這將是膨脹!

PSS我懷疑哈德利的功能之一可能是我所需要的東西(如mutate_each?),但我一直沒能弄明白..

+0

試試這個'計數%>%mutate_each(玩意兒(./小時),-Hours)' – agenis

+0

但你在那裏ISN 'mutate_each'的幫助文件中只有一個例子 – agenis

+5

請不要發佈像'rm(list = ls())'這樣的代碼,除非它對您的示例至關重要。這不是某種人想要複製/粘貼和意外運行的東西。 – Gregor

回答

2

我實在看不出有什麼不對您基地R方式,它非常乾淨。如果您擔心在不運行第一行的情況下多次意外運行第二行,請參考原始counts列如下。我會做微小的調整,像這樣做:無論names長度

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

使用[[[保證數據類型。

我喜歡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