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))

我想从 的所有其他值中减去yfor的值,由 id1 的级别分隔,同时保留. 我最终会得到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”列,因此将它们自动保留在那里会不那么麻烦。

4

2 回答 2

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 回答
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 回答