我有一个包含“实时”治疗费率和“死亡”治疗费率的数据框。我想从生活中减去被杀死的治疗方法:
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))
我想从y
的所有其他值中减去id2=="killed"
的{{1}}的值,以id1的级别分隔,同时保留y
。我最终会
otherFactor
这几乎有效:
id1 id2 y otherFactor
a live1 9 1
a live2 9 1
b live1 10 2
b live2 10 3
除了你丢失了otherFactor的值。也许我可以使用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"))
将merge
的值重新放入,但实际上我有大约十几个“otherFactor”列,所以将它们自动保存在那里会不那么麻烦。 / p>
答案 0 :(得分: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
答案 1 :(得分: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
不等于“kill”的行子集化。