2

次のようなテーブルがあります。

ここに画像の説明を入力

そして、net=gross-tare の場合、次のようにする必要があります。

ここに画像の説明を入力

どうすればいいですか?


まず、データを溶かして列としてキャストし、正味の読み取り値用に新しい列を作成しました。

  df_m <- melt(df, id = 1:3)
  df_c <- cast(df_m, ... ~ variable + type)

  df_c$wr_net  <- df_c$wr_gross  - df_c$wr_tare
  df_c$wc_net  <- df_c$wc_gross  - df_c$wc_tare
  df_c$tsa_net <- df_c$tsa_gross - df_c$tsa_tare

どちらが与える

ここに画像の説明を入力

しかし今、このテーブルを溶かして、データフレームを「総」と「風袋」と「正味」の値を持つ「タイプ」の列で必要な方法で表示する方法を理解できません。

もっと簡単な方法はありますか?メルト/キャストで間違ったツリーを吠えていますか?


これを使用して、私のデータの小さなサンプルを再現できます...

  df <- structure(list(train = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "AC0485n", class = "factor"), 
    position = c(1L, 1L, 2L, 2L, 3L, 3L), type = structure(c(2L, 
    1L, 2L, 1L, 2L, 1L), .Label = c("gross", "tare"), class = "factor"), 
    wids_raw = c(24.85, 146.2, 26.16, 135, 24.7, 135.1), wids_corr = c(26.15, 
    145.43, 27.44, 134.43, 26, 134.52), tsa = c(24.1, 139.2, 
    25, 133.6, 24, 131.1)), .Names = c("train", "position", "type", 
    "wr", "wc", "tsa"), class = "data.frame", row.names = c(NA, 
    -6L))
4

2 に答える 2

4

本当に reshape を使用してそれをやりたい場合は、次のようにします。

library(reshape2)

df_m <- melt(df, id = 1:3)

df_c <- dcast(df_m, ... ~  type)
df_c$net <- df_c$gross  - df_c$tare

df_m2 <- melt(df_c, 1:3)
names(df_m2)[4] <- "type"

dcast(df_m2, ... ~ variable)
于 2011-05-28T12:51:16.390 に答える
3

必要なのはddplyを使用することだけだと思います。

ddply(df,.(position),.fun=function(x){
newrow <- x[1,]
newrow$type <- "net"
newrow[4:6] <- x[x$type=="gross",4:6] - x[x$type=="tare",4:6]
return(rbind(x,newrow))
})

戻る、

   train   position  type     wr     wc   tsa
 1 AC0485n        1  tare  24.85  26.15  24.1
 2 AC0485n        1 gross 146.20 145.43 139.2
 3 AC0485n        1   net 121.35 119.28 115.1
 4 AC0485n        2  tare  26.16  27.44  25.0
 5 AC0485n        2 gross 135.00 134.43 133.6
 6 AC0485n        2   net 108.84 106.99 108.6
 7 AC0485n        3  tare  24.70  26.00  24.0
 8 AC0485n        3 gross 135.10 134.52 131.1
 9 AC0485n        3   net 110.40 108.52 107.1

編集:そして、あなたが本当にメルト/キャストを使いたいのなら、これはうまくいくと思います:

dd <-  melt.data.frame(df_c,id.vars=1:2)
dd$type <- factor(do.call("rbind",strsplit(as.character(dd$variable),"_"))[,2])
dd$variable <- factor(do.call("rbind",strsplit(as.character(dd$variable),"_"))[,1])
于 2011-05-28T04:18:05.967 に答える