5

次のようなデータフレームがあるとします

set.seed(7302012)

county         <- rep(letters[1:4], each=2)
state          <- rep(LETTERS[1], times=8)
industry       <- rep(c("construction", "manufacturing"), 4)
employment     <- round(rnorm(8, 100, 50), 0)
establishments <- round(rnorm(8, 20, 5), 0)

data <- data.frame(state, county, industry, employment, establishments)

  state county      industry employment establishments
1     A      a  construction        146             19
2     A      a manufacturing        110             20
3     A      b  construction        121             10
4     A      b manufacturing         90             27
5     A      c  construction        197             18
6     A      c manufacturing         73             29
7     A      d  construction         98             30
8     A      d manufacturing        102             19

これを作り直して、各行が郡と産業ではなく (州と) 郡を表し、列construction.employmentが 、construction.establishments、および製造業の類似バージョンになるようにします。これを行う効率的な方法は何ですか?

1 つの方法は、サブセット化することです

construction <- data[data$industry == "construction", ]
names(construction)[4:5] <- c("construction.employment", "construction.establishments")

製造の場合も同様に、マージを行います。業界が 2 つしかない場合、これはそれほど悪くはありませんが、14 の業界があると想像してください。このプロセスは面倒になります (ただしfor、 のレベルにまたがるループを使用することで軽減されますindustry)。

他のアイデアはありますか?

4

2 に答える 2

8

あなたの質問を正しく理解していれば、これはベースRのリシェイプで行うことができます:

reshape(data, direction="wide", idvar=c("state", "county"), timevar="industry")
#   state county employment.construction establishments.construction
# 1     A      a                     146                          19
# 3     A      b                     121                          10
# 5     A      c                     197                          18
# 7     A      d                      98                          30
#   employment.manufacturing establishments.manufacturing
# 1                      110                           20
# 3                       90                           27
# 5                       73                           29
# 7                      102                           19 
于 2012-07-30T16:59:17.200 に答える
4

また、reshapeパッケージを使用します。

library(reshape) 
m <- reshape::melt(data) 
cast(m, state + county~...) 

降伏:

> cast(m, state + county~...) 
  state county construction_employment construction_establishments manufacturing_employment manufacturing_establishments
1     A      a                     146                          19                      110                           20
2     A      b                     121                          10                       90                           27
3     A      c                     197                          18                       73                           29
4     A      d                      98                          30                      102                           19

私は個人的にベースのリシェイプを使用しているので、おそらくreshape2(Wickham)を使用してこれを示す必要がありましたが、reshape2パッケージがあったことを忘れていました。少し違う:

library(reshape2) 
m <- reshape2::melt(data) 
dcast(m, state + county~...) 
于 2012-07-30T17:03:14.373 に答える