Условная сумма на основе индикатора


У меня есть такой фрейм данных:

   A   B   Ind
1 10   8     1
2  9  10     2
3  7   1     2
4 19  20     1
5  .   .     .

Как я могу суммировать столбцы на основе значения Ind? If Ind==1, sum from column A, if Ind==2, sum from column B. Например, выходные данные для первых 4 строк должны быть 10+10+1+19=30, где первые 10 - в A, вторые 10 - в B, третьи 1-в B и четвертые 19-в A.

3 3

3 ответа:

Другой вариант использования I

 sum(with(dat,A*I(Ind==1)+B*(Ind==2)))

Предполагая ваши данные.фрейм называется "mydf", вы можете использовать ifelse следующим образом:

sum(with(mydf, ifelse(Ind == 1, A, B)))

Вот результат части ifelse:

> with(mydf, ifelse(Ind == 1, A, B))
[1] 10 10  1 19
Конечно, если у вас есть более одного условия, вы можете вложить их по мере необходимости.

Вот более подробная альтернатива, которая использует базовое подмножество:

sum(with(mydf, c(mydf[Ind == 1, "A"], mydf[Ind == 2, "B"])))

Решение с использованием which:

sum( df$A[which(df$Ind==1)] , df$B[which(df$Ind==2)] )