[Rpackage]R語言plyr包使用方法——可進行類似資料透視表的操作

TOMOCAT發表於2018-08-13

作者:leengsmile
連結:https://www.jianshu.com/p/bfddfe29aa39
來源:簡書

一、使用的資料集

| year| name| percent| sex|
|---------:||---------:||---------:||---------:|
| 1880| John| 0.081541| boy|
| 1880| William| 0.080511| boy|
| 1880| James| 0.050057| boy|
| 1880| Charles| 0.045167| boy|
| 1880| George| 0.043292| boy|
| 1880| Frank| 0.02738| boy|
| 1880| Joseph| 0.022229| boy|
| 1880| Thomas| 0.021401| boy|

該表是美國新生兒的取名彙總表。

 

二、plyr包函式

1、每年包含的記錄數

record_count <- function(df) {
  return(data.frame(count = nrow(df)))
}
ddply(baby_names,     # 資料集
      .(year),        # 分類的標準
      record_count    # 函式
)

2、男孩、女孩名的各自排名

以2008年的資料為例,男孩名"Jacob"的比例最高,排名應當是第一,"Michael"緊跟其後,排名應當第二,依此類推。對於女孩名,"Emma"排名第一,"Isabella"排名第二,"Emily"排名第三等等。我們希望得到這樣的結果。

對於2008年的資料,可以通過簡單的rank即可得到,不過要對男孩和女孩分別排序。

baby_names_2008_boy <- subset(baby_names_2008, sex == "boy") # 獲取男孩名
baby_names_2008_boy$rank <- rank(- baby_names_2008_boy$percent) # 排序
head(baby_names_2008_boy) # 檢視

使用ddply函式

ddply(baby_names, 
      .(year, sex), 
      transform, 
      rank = rank(-percent, ties.method = "first")
)

3、排名前100的男孩名與女孩名在當年中的比例

baby_names_top100 <- subset(baby_names, rank <= 100)  # 將前100排名的資料篩選出來
baby_names_top100_trend <- ddply(baby_names_top100, 
                                 .(year, sex), # 按年和性別分割
                                 summarize, # 彙總資料
                                 trend = sum(percent)) # 彙總方式(求和)

這裡出現一個新的操作函式summarize(),該函式是對資料做彙總,與transform不一樣的是,該函式並不追加結果到原始資料,而是產生新的資料集。比如想知道,2008年的男孩名中,排名最高和最低的名字的百分比之差,可以通過如下方式求得:

summarize(baby_names_2008_boy, trend = max(percent) - min(percent))
# 0.010266

 

相關文章