2017-02-15 75 views
0

晚上好於R總計數據,分組和基於兩組

我有這個樣子

FY  Type  Total 
2014 State $5,000 
2014 Federal $2,596 
2014 State $5,123 
2014 Federal $2,567 
2013 State $5,555 
2013 Federal $2,784 
2013 State $5,562 
2013 Federal $2,556 

我如何將能夠通過兩個財政年度獲得總計和鍵入R數據?

因此,它可以看起來像:

FY  Type Total 
2013 Federal $5,340 
2013 State $11,117 
2014 Federal $5,163 
2014 State $10,123 
+0

謝謝! 我不確定我是否理解你在說什麼。轉換爲數字?總數在R中是數字。你能稍微打破這兩個步驟嗎? –

+1

'$ 5,000'不是R中的一個數字。它有一個'$'和',',因此,不是一個數字。 – thelatemail

+0

http://stackoverflow.com/questions/1660124/how-to-sum-a-variable-by-group – akrun

回答

2

您將需要轉換爲數字,以獲得的總和,那麼它是一個簡單的聚集。這裏使用transformTotal列臨時轉換爲數字,保持原始數據不變。

aggregate(
    Total ~ Type + FY, 
    transform(df, Total = as.numeric(gsub("\\D", "", Total))), 
    sum 
) 
#  Type FY Total 
# 1 Federal 2013 5340 
# 2 State 2013 11117 
# 3 Federal 2014 5163 
# 4 State 2014 1

或者與xtabs稍有不同的輸出。

xtabs(Total ~ ., transform(df, Total=as.numeric(gsub("\\D", "", Total)))) 
#  Type 
# FY  Federal State 
# 2013 5340 11117 
# 2014 5163 1
+0

謝謝!我已經編碼它預先格式化爲適當的貨幣。如果代碼是一個數字,代碼如何改變? –

1

我們可以使用tidyverse。通過「風雲」,「類型」分組後,隨着parse_number提取「合計」的數字部分,得到sumpaste$作爲前綴

library(tidyverse) 
df1 %>% 
    group_by(FY, Type) %>% 
    summarise(Total = dollar_format()(sum(parse_number(Total)))) 
# FY Type Total 
# <int> <chr> <chr> 
#1 2013 Federal $5,340 
#2 2013 State $11,117 
#3 2014 Federal $5,163 
#4 2014 State $10,123 

注:dollar_formatscalesparse_numberreadrsummarisegroup_bydplyr


我們也可以使用rowsumbase R

rowsum(as.numeric(gsub("[^0-9.]+", "", df1$Total)), interaction(df1[-3])) 
+0

謝謝!我已經編碼它預先格式化爲適當的貨幣。如果代碼是一個數字,代碼如何改變? –

+0

@勞拉我認爲'parse_number'仍然會提取數字部分,即使它是散佈字符的其他格式。你測試過了嗎? – akrun