2015-04-28 56 views
-1

如何計算data_foobar的每個單元的相對頻率,相對於data_baseline(= 100%)?兩者都包含的物品絕對計數,按年,而是data_foobar僅包含年值> 0如何計算data.frame中每個單元格相對於第二個data.frame的相對頻率?

樣本數據(更新):

data_baseline <- structure(list(Year = 2010:2014, `Area Studies` = c(3636L, 4247L, 
3922L, 2050L, 201L), Arts = c(2082L, 1993L, 1859L, 974L, 87L)), .Names = c("Year", 
"Area Studies", "Arts"), row.names = 111:115, class = "data.frame") 

data_foobar <- structure(list(Year = 2011:2014, `Area Studies` = c(1L, 2L, 2L, 
NA), Arts = c(5L, 8L, 3L, NA)), .Names = c("Year", "Area Studies", 
"Arts"), row.names = c("58", "59", "60", "61"), class = "data.frame") 

如何將它與plyr/dplyr做些什麼呢?

+1

您在此處撰寫的大部分內容對於該問題不是必需的。我認爲你可以安全地刪除一切之前「我怎麼......」 – Frank

回答

4

的會給你(以百分比的形式)data_foobar的相對頻率「在[-1]從逐元素除法運算年山坳

> cbind(data_foobar[1], 100*data_foobar[-1]/data_baseline[-1]) 
    Year Area Studies  Arts 
57 2010 0.02750275 0.2881844 
58 2011 0.02354603 0.2508781 
59 2012 0.05099439 0.4303389 
60 2013 0.09756098 0.3080082 
61 2014   NA  NA 

如果你的數據不那麼」常規」和有山坳名稱不匹配,你可能需要使用intersect(names(data_baseline), names(data_foobar))[-1]作爲列選擇矢量

對於修改後的問題:

cbind(data_foobar[1], 
     100*data_foobar[ data_foobar$Year %in% data_baseline$Year, -1]/ 
      data_baseline[ data_foobar$Year %in% data_baseline$Year, -1 ]) 

    Year Area Studies  Arts 
57 2010 0.02750275 0.2881844 
58 2011 0.02354603 0.2508781 
59 2012 0.05099439 0.4303389 
60 2013 0.09756098 0.3080082 
61 2014   NA  NA 

這使用邏輯索引來選擇僅在年份列中共享的那些年份

+0

這似乎是一個很好的簡單的解決方案,不幸的是,真正的數據幀已經錯過了幾年,導致錯誤'/只爲相同大小的數據幀定義' 。順便說一句,給定的intersect命令還會拋出錯誤!「Year」:無效參數類型? – eMPee584

+1

我明顯未能測試交叉碼。試一下:'intersect(names(data_baseline),names(data_foobar))[ - 1]'。您應該發佈與您真實問題相同複雜度的樣本數據集。 –

相關問題