Самый простой способ вычитания, связанного с одним уровнем фактора, из значений, связанных со всеми другими уровнями фактора.

У меня есть фрейм данных, содержащий ставки на «живое» лечение и ставки на «убитое» лечение. Я хотел бы вычесть убитые обработки из живых:

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", из всех остальных значений y, разделенных уровнями id1, при сохранении otherFactor. я бы закончил с

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», поэтому было бы менее обременительно просто хранить их там автоматически.


person Drew Steen    schedule 25.06.2012    source источник


Ответы (1)


Функция 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, не равным «убийству».

person IRTFM    schedule 25.06.2012