Суммируйте значения из разных столбцов и строк - PullRequest
1 голос
/ 24 января 2020

Есть ли встроенный способ подсчета сумм по разным строкам и столбцам? Я знаю, что мог бы сформировать новый фрейм данных из id, drug, day2, sum_d2, переименовать последние два столбца, удалить эти столбцы в «старом» фрейме, выполнить rbind со «старым» фреймом и суммировать по группам. Но это кажется странно сложным и, возможно, подверженным ошибкам.

Как рассчитать сумму sum_1 и sum_2 для drug_a, заданную в 2020-01-02, используя id + drugname в качестве переменных группировки + day1 + day2 (когда эти два одинаковых)?

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

Пример данных:

id <- c(rep(1,2))
drug <- c(rep("Drug_a",2))                     
day1 <- c(rep("2020-01-01",1),rep("2020-01-02",1))
sum_1 <- c(rep(250,1),rep(550,1))
day2 <- c(rep("2020-01-02",1),rep("2020-01-03",1))
sum_2 <- c(rep(100,1),rep(75,1))

example_data <- data.frame(id,drug,day1,sum_1,day2,sum_2)

  id   drug       day1 sum_1       day2 sum_2
1  1 Drug_a 2020-01-01   250 2020-01-02   100
2  1 Drug_a 2020-01-02   550 2020-01-03    75

Ожидаемый результат в этих строках:

  id   drug       day    sum
1  1 Drug_a 2020-01-01   250 
2  1 Drug_a 2020-01-02   650 
3  1 Drug_a 2020-01-03    75

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Возможно, что-то подобное может сработать. Вы можете использовать pivot_longer, чтобы поместить day и sum в один столбец (т. Е. Объединить day_1 и day_2 в day, sum_1 и sum_2 в sum).

library(tidyverse)

example_data %>%
  pivot_longer(cols = c(-id, -drug), names_to = c(".value", "group"), names_sep = "_") %>%
  group_by(id, drug, day) %>%
  summarise (total = sum(sum))

# A tibble: 3 x 4
# Groups:   id, drug [1]
     id drug   day        total
  <dbl> <fct>  <fct>      <dbl>
1     1 Drug_a 2020-01-01   250
2     1 Drug_a 2020-01-02   650
3     1 Drug_a 2020-01-03    75

Данные

id <- c(rep(1,2))
drug <- c(rep("Drug_a",2))                     
day_1 <- c(rep("2020-01-01",1),rep("2020-01-02",1))
sum_1 <- c(rep(250,1),rep(550,1))
day_2 <- c(rep("2020-01-02",1),rep("2020-01-03",1))
sum_2 <- c(rep(100,1),rep(75,1))

example_data <- data.frame(id,drug,day_1,sum_1,day_2,sum_2)
1 голос
/ 24 января 2020

Мы можем использовать melt из data.table

library(data.table)
melt(setDT(example_data), measure = patterns('^day', '^sum'),
    value.name = c('day', 'sum'))[, .(total = sum(sum)), .(id, drug, day)]
#   id   drug        day total
#1:  1 Drug_a 2020-01-01   250
#2:  1 Drug_a 2020-01-02   650
#3:  1 Drug_a 2020-01-03    75

данные

id <- c(rep(1,2))
drug <- c(rep("Drug_a",2))                     
day_1 <- c(rep("2020-01-01",1),rep("2020-01-02",1))
sum_1 <- c(rep(250,1),rep(550,1))
day_2 <- c(rep("2020-01-02",1),rep("2020-01-03",1))
sum_2 <- c(rep(100,1),rep(75,1))

example_data <- data.frame(id,drug,day_1,sum_1,day_2,sum_2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...