Последовательная сумма столбца, только если другой столбец имеет правильное значение в R - PullRequest
0 голосов
/ 14 ноября 2018

У меня в настоящее время есть фрейм данных, который выглядит следующим образом (со временем в секундах и Zone1 - логическим значением):

Time Zone1
   1     0
   3     0
   4     1
   5     1
   6     1
   7     0
   9     1
   10    1

Я хотел бы получить сумму значений для последовательных критериев, чтобы получить что-то вродеэто:

Time Zone1 TimeInZone
   1     0         NA
   3     0         NA
   4     1          2
   5     1          2
   6     1          2
   7     0         NA
   9     1          1
   10    1          1

Так вот так

Я не могу найти, что делать, как я могу справиться с этим?Спасибо.

РЕДАКТИРОВАНИЕ: Более точный фрейм данных

1 Ответ

0 голосов
/ 14 ноября 2018

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

library(data.table)
df <- data.table(Value=c(3,4,1,1,2), Criteria=c(1,1,2,1,3))
# First, generate a logical vector that indicates if the criterium changed:
df[, changed:=c(TRUE, Criteria[-1] != Criteria[-length(Criteria)])]
# Then, calculate the cumulative sum to get an index:
df[, index:=cumsum(changed)]
# Calculate the sum for each level of index:
df[, Sum:=sum(Value), by=index]
# print everything:
print(df)

Результат:

   Value Criteria changed index Sum
1:     3        1    TRUE     1   7
2:     4        1   FALSE     1   7
3:     1        2    TRUE     2   1
4:     1        1    TRUE     3   1
5:     2        3    TRUE     4   2

Чтобы получить сумму последнего блока, используйте магию data.table:

setkey(df, index)
nextblocksums <- df[index!=max(index), .(index=index+1,nextBlockSum=Sum)]
df[ nextblocksums , LastBlocksSum:=i.nextBlockSum]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...