Как перезаписать значения после группировки в R, но с сохранением начального значения для группы - PullRequest
1 голос
/ 03 февраля 2020

Я хотел бы сделать простую перезапись в R, но я думаю, что не все так просто, как я думал. У меня есть beginning, end, majorCategory и subCategory. Для каждого majorCategory есть beginning и end. У меня есть длина majorCategory, и я вычисляю длину subcategories, и с этого момента я застрял, потому что я хотел бы перезаписать начало и конец для подкатегорий, но в то же время сохранить начальные начала для majorCategory. Как я могу это сделать?

 df <- structure(list(majorCat = structure(c(1L, 1L, 1L, 1L, 1L, 1L,  1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 
 1L), .Label = c("Major_A", "Major_B"), class = "factor"), begin = c(60, 60, 60, 60, 60, 60, 60,60,60, 
 60, 20, 20, 20, 20, 20), end = c(75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 80, 80, 80, 80, 80), subCat 
 = c("d", "b", "c", "e", "a", "b", "e", "a", "d", "b", "d", "b", "d", "e", "b")), row.names = c("1", 
 "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"), class = "data.frame")


  library(dplyr)
  df %>% 
     group_by(begin, end, subCat) %>% 
     summarise(countt = n()) %>% 
     mutate(percc = countt/sum(countt),
     lengthh = end - begin,
     lengthhSubCat = lengthh * percc) %>% select(begin, end, lengthh , lengthhSubCat)

enter image description here

Я бы очень хотел добраться до этого:
enter image description here

Большое спасибо за потраченное время!

1 Ответ

2 голосов
/ 03 февраля 2020

После создания столбцов создайте новую группу с помощью paste, используя 'begin', 'end' ('grp'), объедините элемент first элемента 'begin' с последним элементом, удаленным из 'lengthhSubCat' выполните кумулятивную сумму, чтобы создать столбец begin, в то время как мы берем lead of begin и заполняем наблюдение last соответствующим значением end для обновления столбца end

library(dplyr)
library(stringr)
df %>% 
   group_by(begin, end, subCat) %>%
   summarise(countt = n()) %>%
   mutate(percc = countt/sum(countt),
         lengthh = end - begin,
         lengthhSubCat = lengthh * percc) %>% 
   group_by(grp = str_c(begin, end, sep="_")) %>% 
   mutate(begin = cumsum(c(first(begin), lengthhSubCat[-n()])),
         end = lead(begin, default = last(end))) %>%
   ungroup %>%
   select(begin, end, lengthh, lengthhSubCat)
# A tibble: 8 x 4
#  begin   end lengthh lengthhSubCat
#  <dbl> <dbl>   <dbl>         <dbl>
#1  20    44        60          24  
#2  44    68        60          24  
#3  68    80        60          12  
#4  60    63        15           3  
#5  63    67.5      15           4.5
#6  67.5  69        15           1.5
#7  69    72        15           3  
#8  72    75        15           3  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...