2012-06-25 35 views
1

我有一個數據幀,包含'活'治療的費率和'死亡'治療的費率。我想從活的減去殺死治療:從與所有其他因子水平相關的值中減去與一個因子水平相關聯的最簡單的方法

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的所有其他值,通過ID1的水平分離減去y爲其id2=="killed"的值,而保留​​。我最終會與

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」列,所以將它們自動保存在那裏不那麼麻煩。

回答

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 
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不等於子集出來的行''殺死'