Сумма по группе с тем же именем - PullRequest
0 голосов
/ 05 октября 2018

Есть ли способ суммировать эти данные без цикла в r?В первом ряду нет ни NA, ни пробела.Это список последовательных данных.

До:

Column 1  Column 2
FLOWING 
DOWNTIME  1,922
FLOWING   23
FLOWING   8
FLOWING   23
FLOWING   26
DOWNTIME  36
FLOWING   1
FLOWING   8
DOWNTIME  12
FLOWING   0
FLOWING   3
FLOWING   13
DOWNTIME  2
FLOWING   10
FLOWING   12
FLOWING   30
DOWNTIME  24
DOWNTIME  1

После:

Column 1  Column 2
FLOWING 
DOWNTIME  1,922
FLOWING   80
DOWNTIME  36
FLOWING   9
DOWNTIME  12
FLOWING   16
DOWNTIME  2
FLOWING   52
DOWNTIME  25

1 Ответ

0 голосов
/ 05 октября 2018

В столбце 2 есть ,, что делает класс character.Таким образом, мы удаляем ,, преобразовываем его в numeric и получаем sum после группировки по идентификатору длины строки 'Column1' (rleid из data.table)

library(dplyr)
library(data.table)
df1 %>%
    mutate(Column2 = as.numeric(str_remove(Column2, ","))) %>%
    group_by(grp = rleid(Column1)) %>% 
    summarise(Column1 = first(Column1), 
              Column2 = sum(Column2)) %>%
    ungroup %>%
    select(-grp)

Или используя data.table методы

setDT(df1)[, .(Column1 = first(Column1), 
      Column2 = sum(as.numeric(sub(",", "", Column2)))), .(grp = rleid(Column1))]

data

df1 <- structure(list(Column1 = c("FLOWING", "DOWNTIME", "FLOWING", 
 "FLOWING", "FLOWING", "FLOWING", "DOWNTIME", "FLOWING", "FLOWING", 
 "DOWNTIME", "FLOWING", "FLOWING", "FLOWING", "DOWNTIME", "FLOWING", 
 "FLOWING", "FLOWING", "DOWNTIME", "DOWNTIME"), Column2 = c("", 
 "1,922", "23", "8", "23", "26", "36", "1", "8", "12", "0", "3", 
 "13", "2", "10", "12", "30", "24", "1")), class = "data.frame", 
 row.names = c(NA, -19L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...