2

「ライブ」処理の料金と「強制終了」処理の料金を含むデータフレームがあります。殺された治療を生きている治療から差し引きたい:

df <- data.frame(id1=gl(2, 3, labels=c("a", "b")),
                 id2=rep(gl(3, 1, labels=c("live1", "live2", "killed")), 2), 
                 y=c(10, 10, 1, 12, 12, 2),
                 otherFactor = gl(3, 2))

を維持しながら、 id1 のレベルで区切られたの他のすべての値から、 yforの値を減算したいと思います。私はで終わるだろうid2=="killed"yotherFactor

id1    id2   y otherFactor
  a  live1   9           1
  a  live2   9           1
  b  live1  10           2
  b  live2  10           3

これはほとんど機能します:

df_minusKill <- ddply(df, .(id1), function(x) x$y[x$id2!="killed"] - x$y[x$id2=="killed"])
names(df_minusKill) <- c("id1", "live1", "live2")
df_minusKill_melt <- melt(df_minusKill, measure.var=c("live1", "live2"))

otherFactor の値を失うことを除いて。mergeの値を元に戻すために使用できるかもしれませんotherFactorが、実際には「otherFactor」列が約 10 個あるので、それらを自動的に保持する方が面倒ではありません。

4

2 に答える 2

2

このby関数は、データフレームのセクションを要因ごとに個別に処理できます (または、以下を使用できますlapply(split(df , ...)):

>  by(df, df$id1, FUN= function(x) x[['y']]-x[ x$id2=="killed", "y"] )
df$id1: a
[1] 9 9 0
--------------------------------------------------------------------------- 
df$id1: b
[1] 10 10  0
> unlist( by(df, df$id1, FUN= function(x) x[['y']]-x[ x$id2=="killed", "y"] ) )
a1 a2 a3 b1 b2 b3 
 9  9  0 10 10  0 

これを df の列に割り当て、id2「killing」に等しくない行をサブセット化できます。

于 2012-06-25T20:40:46.983 に答える
2
df2 <- ddply(df, .(id1), transform, y = y-y[id2=="killed"])
df2[-which(df2$id2=="killed"),]
  id1   id2  y otherFactor
1   a live1  9           1
2   a live2  9           1
4   b live1 10           2
5   b live2 10           3
于 2012-06-25T20:38:08.140 に答える