Как суммировать переменную по группе с NA? - PullRequest
0 голосов
/ 30 января 2019

У меня большой набор данных, подобный этому:

ID    Number
153    31
       28
       31
       30
104    31
       30
254    31
266    31

, и я хочу вычислить сумму по ID, включая NA.Я имею в виду получить:

    ID   Number
    153   120
    104   61
    254   31
    266   31

Я пытался aggregate, но я не получил ожидаемого результата.Была бы признательна за помощь

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Или сделайте это прямо :) :)

cbind(df1[df1$ID != "", "ID", drop = FALSE], 
      Number = rev(diff(c(0, rev((rev(cumsum(rev(df1$Number)))[df1$ID != ""]))))))
0 голосов
/ 30 января 2019

Один из вариантов - преобразовать пробелы в NA, затем fill заменить элементы NA соседними элементами, не относящимися к NA, как указано выше в «ID», сгруппированные по «ID», получить sum из «Number»

library(tidyverse)
df1 %>% 
  mutate(ID = na_if(ID, "")) %>% 
  fill(ID) %>% 
  group_by(ID) %>% 
  summarise(Number = sum(Number))
# A tibble: 4 x 2
#  ID    Number
#  <chr>  <int>
#1 104       61
#2 153      120
#3 254       31
#4 266       31

Или без использования fill создайте переменную группировки с логическим выражением и cumsum, а затем выполните sum

df1 %>% 
  group_by(grp = cumsum(ID != "")) %>% 
  summarise(ID = first(ID), Number = sum(Number)) %>% 
  select(-grp)

данные

df1 <- structure(list(ID = c("153", "", "", "", "104", "", "254", "266"
 ), Number = c(31L, 28L, 31L, 30L, 31L, 30L, 31L, 31L)), row.names = c(NA, 
 -8L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...