1

複数のグループ化に基づいて、長い形式から広い形式にデータを再形成しようとしていますが、成功しません。このデータで:

id <- 1:20
month <- rep(4:7, 50)
name <- rep(c("sam", "mike", "tim", "jill", "max"), 40)
cost <- sample(1:100, 200, replace=TRUE)
df <- data.frame(id, month, name, cost)

df.mo.mean <- aggregate(df$cost ~ df$name + df$month, FUN="mean")
df.mo.sd <- aggregate(df$cost ~ df$name + df$month, FUN="sd")

df.mo <- data.frame(df.mo.mean, df.mo.sd)
df.mo <- df.mo[,-c(4,5)]
df.mo[3:4] <- round(df.mo[3:4],2)

head(df)
   id month name cost
1  1     4  sam   29
2  2     5 mike   93
3  3     6  tim   27
4  4     7 jill   67
5  5     4  max   28
6  6     5  sam   69

私は自分のデータを以下のように見せようとしていて、未知の数の名前のためにそれを一般化しようとしています (ただし、最大 15 未満)

month    name1.cost.mean  name1.cost.sd  name2.cost.mean  name2.cost.sd
1        45               4              40               6
2        ...   

私は試してみましたがreshape、成功do.callしませんでした。rbind私が考えることができる唯一の他の方法は、ループを使用することです。これは、何か間違ったことをしていることを意味します。私は経験がなく、plyrこの問題をベースパッケージで解決したいと考えています(学習目的で)が、それが不可能な場合は、他の提案が非常に役立ちます

4

4 に答える 4

1

何を求めているのかわかりませんが、このようなものが役立つかもしれません

> set.seed(1)
> df <- data.frame(id=1:20, month=rep(4:7, 50), 
+                  name=rep(c("sam", "mike", "tim", "jill", "max"), 40),
+                  cost= sample(1:100, 200, replace=TRUE))
> 
> DF.mean <- aggregate(cost ~ name + month, FUN=mean, data=df)  ## mean
> DF.sd   <- aggregate(cost ~ name + month, FUN=sd, data=df)    ## sd
> 
> x1 <- as.data.frame.matrix(xtabs(cost~month+name, data=DF.mean)) # reshaping mean
> colnames(x1) <- paste0(colnames(x1), ".mean")
> x2 <- as.data.frame.matrix(xtabs(cost~month+name, data=DF.sd))   # reshaping sd
> colnames(x2) <- paste0(colnames(x2), ".sd")
> 
> cbind(x1, x2)
  jill.mean max.mean mike.mean sam.mean tim.mean  jill.sd   max.sd  mike.sd   sam.sd   tim.sd
4      55.3     63.3      57.6     63.4     43.3 34.62834 23.35261 22.91627 28.89906 25.42112
5      49.3     51.1      48.4     43.0     47.6 25.00689 27.85059 23.16223 24.33562 32.13928
6      60.4     52.1      38.6     53.0     52.4 23.61826 29.74503 34.39703 23.28567 20.88700
7      50.0     62.7      51.7     52.8     49.5 30.76073 23.98634 32.10763 32.27589 23.00845

また、追加のパッケージなしで R ベース関数を使用して @Metrics アプローチを実行できることに注意してください。

> kk <- aggregate(cost ~ name + month, FUN=function(x) c(mean=mean(x), sd=sd(x)), data=df)
> reshape(kk,timevar="name",idvar="month",direction="wide")
  month cost.jill.mean cost.jill.sd cost.max.mean cost.max.sd cost.mike.mean cost.mike.sd cost.sam.mean cost.sam.sd cost.tim.mean cost.tim.sd
1      4       55.30000     34.62834      63.30000    23.35261       57.60000     22.91627      63.40000    28.89906      43.30000    25.42112
6      5       49.30000     25.00689      51.10000    27.85059       48.40000     23.16223      43.00000    24.33562      47.60000    32.13928
11     6       60.40000     23.61826      52.10000    29.74503       38.60000     34.39703      53.00000    23.28567      52.40000    20.88700
16     7       50.00000     30.76073      62.70000    23.98634       51.70000     32.10763      52.80000    32.27589      49.50000    23.00845
于 2013-10-19T23:02:22.890 に答える
0

2 つの reshape を使用して、結果をマージできます

library(reshape2)
> dcast(df, month ~ name, mean, value.var="cost")
  month jill  max mike  sam  tim
1     4 39.5 54.6 45.6 48.4 57.4
2     5 45.1 61.7 45.4 54.5 50.8
3     6 41.9 45.7 56.4 43.1 52.1
4     7 51.6 38.6 43.6 65.1 51.5

> dcast(df, month ~ name, sd, value.var="cost")
  month     jill      max     mike      sam      tim
1     4 29.31154 25.25954 28.96051 31.32695 29.82989
2     5 31.02848 27.96049 34.32589 30.08599 23.95273
3     6 32.09517 32.50316 37.16988 27.03681 30.42094
4     7 19.56300 31.50026 28.65969 36.53750 26.73429
于 2013-10-19T23:12:37.923 に答える