2

次の形式の R データフレームがあります。

FIRM   WORKER HOURS
FIRM1  A1     H1
FIRM1  A2     H2
FIRM1  A3     H3
FIRM1  B1     H4
FIRM1  B2     H5 
FIRM2  A1     H6
FIRM2  C1     H7

さまざまな教育カテゴリ (A、B、C、...) の従業員を抱える企業があります。教育カテゴリが独自の列に合計され、すべての企業がそれぞれの行を 1 つだけ持つように、データフレームを変換したいと考えています。したがって、初期データフレームを次の形式に変換する必要があります。

FIRM   HOURS_A   HOURS_B HOURS_C
FIRM1  H1+H2+H3  H4+H5  
FIRM2  H6                H7

これを行うための最もきちんとした方法は何でしょうか?

4

2 に答える 2

2

最初に集約してから再形成します。

データ:

x <- read.table(header=TRUE, text="
FIRM   WORKER HOURS
FIRM1  A1     1
FIRM1  A2     2
FIRM1  A3     3
FIRM1  B1     4
FIRM1  B2     5 
FIRM2  A1     6
FIRM2  C1     7
")

コード:

tmp <- aggregate(HOURS~FIRM+WORK, data=within(x, WORK <- substr(WORKER,1,1)), sum)

reshape(tmp, idvar="FIRM", timevar="WORK", direction="wide")

結果:

   FIRM HOURS.A HOURS.B HOURS.C
1 FIRM1       6       9      NA
2 FIRM2       6      NA       7
于 2013-09-03T17:15:47.510 に答える
0

実際に特定の値を合計したいという意味であり、data.frame は次のようになっていると仮定しています。

mydf <- structure(
  list(FIRM = c("FIRM1", "FIRM1", "FIRM1", "FIRM1", "FIRM1", "FIRM2", "FIRM2"), 
       WORKER = c("A", "A", "A", "B", "B", "A", "C"), 
       HOURS = c(10L, 20L, 15L, 13L, 12L, 9L, 16L)), 
  .Names = c("FIRM", "WORKER", "HOURS"), 
  class = "data.frame", row.names = c(NA, -7L))
mydf
#    FIRM WORKER HOURS
# 1 FIRM1      A    10
# 2 FIRM1      A    20
# 3 FIRM1      A    15
# 4 FIRM1      B    13
# 5 FIRM1      B    12
# 6 FIRM2      A     9
# 7 FIRM2      C    16

次に、次を使用できますxtabs

xtabs(HOURS ~ FIRM + WORKER, mydf)
#        WORKER
# FIRM     A  B  C
#   FIRM1 45 25  0
#   FIRM2  9  0 16

meltまたは、データセットを次のように変更できますdcast

library(reshape2)
dfL <- melt(mydf, id.vars=c("FIRM", "WORKER"))
dcast(dfL, FIRM ~ variable + WORKER, fun.aggregate=sum, value.var="value")
#    FIRM HOURS_A HOURS_B HOURS_C
# 1 FIRM1      45      25       0
# 2 FIRM2       9       0      16
于 2013-09-03T17:17:49.313 に答える