Группировка данных, начиная с указанного c числа в R - PullRequest
0 голосов
/ 09 января 2020

Извините, если название непонятно. У меня есть данные, как показано ниже; 1, 2, 3 .. месяцы разных лет. И я хочу собрать месяцы отдельно для a и l.

               a         l
1-2006  3.498939 0.8523857
1-2007 14.801777 0.2457656
1-2008  6.893728 0.5381691
2-2006  2.090962 0.6764694
2-2007  9.192913 0.8740950
2-2016  5.059505 1.1761113

Структура данных:

 data<-structure(list(a = c(3.49893890760882, 14.8017770056402, 6.89372828391484, 
                           2.0909624091048, 9.19291324208917, 5.05950526612261, 13.1570625271881, 
                           14.9570662205959, 7.72453112976811, 12.9331892673657  
                           ), l = c(0.852385662732809, 
                                                                      0.245765570168399, 0.538169092055646, 0.676469362818052, 0.874095005203713, 
                                                                      1.17611132212132, 0.76857056091243, 0.622533767341579, 0.9562200838363, 
                                                                      1.10064589903771, 0.85863722854391  
                                      )), class = "data.frame", row.names = c("1-2006", 
                                                                                                                              "1-2007", "1-2008",   

                                                                                                                              "2-2006", "2-2007", 

                                                                                                                              "2-2016",   
                                                                                                                               "3-2015", "3-2016", "3-2017", "3-2018"
                                                                                                                             ))

Например; Я хочу собрать все данные january (1-2005, 1-2006..) и данные за март (3-2012, 3-2015 ..) для а, а также для л. Как этот:

        january_a 
1-2006  3.498939 
1-2007 14.801777 
1-2008  6.893728 

        january_l
1-2006  0.8523857
1-2007  0.2457656
1-2008  0.5381691 


        march_a 
3-2012  9.192913 
3-2015  5.059505 

        march_l
3-2012  0.8740950
3-2015  1.1761113 

Ответы [ 3 ]

3 голосов
/ 09 января 2020

Вы можете добавить столбец, который содержит только числовой префикс, а затем разделить его на:

data$prefix <- sub("^(\\d+).*$", "\\1", row.names(data))
data_a <- split(data[,"a"], data$prefix)
data_a

$`1`
[1]  3.498939 14.801777  6.893728

$`2`
[1] 2.090962 9.192913 5.059505

Данные:

data <- data.frame(a=c(3.498939, 14.801777, 6.893728, 2.090962, 9.192913, 5.059505),
                   l=c(0.8523857, 0.2457656, 0.5381691, 0.6764694, 0.8740950, 1.1761113))
row.names(data) <- c("1-2006", "1-2007", "1-2008", "2-2006", "2-2007", "2-2016")
1 голос
/ 09 января 2020

Это еще один вариант, который вы можете попробовать использовать tidyverse, который возвращает список фреймов данных, где каждый элемент имеет комбинацию месяца и "a" или "l".

library(tidyverse)

data %>%
  rownames_to_column('date') %>%
  pivot_longer(cols = -date) %>%
  separate(date, c('month', 'year'), sep = "-", remove = FALSE) %>%
  group_split(month, name)

#[[1]]
# A tibble: 3 x 5
#  date   month year  name  value
#  <chr>  <chr> <chr> <chr> <dbl>
#1 1-2006 1     2006  a      3.50
#2 1-2007 1     2007  a     14.8 
#3 1-2008 1     2008  a      6.89

#[[2]]
# A tibble: 3 x 5
#  date   month year  name  value
#  <chr>  <chr> <chr> <chr> <dbl>
#1 1-2006 1     2006  l     0.852
#2 1-2007 1     2007  l     0.246
#3 1-2008 1     2008  l     0.538
#...
#... 

. некоторые дополнительные столбцы для уникальной идентификации значений, которые вы можете удалить, если они не нужны.

0 голосов
/ 09 января 2020

Другой вариант: group_split

library(purrr)
library(dplyr)
library(stringr)
data %>%
   rownames_to_column('rn') %>% 
   select(rn, a) %>%
   group_split(rn = str_remove(rn, '-.*'), keep = FALSE) %>% 
   map(flatten_dbl)
#[[1]]
#[1]  3.498939 14.801777  6.893728

#[[2]]
#[1] 2.090962 9.192913 5.059505

data

data <- data.frame(a=c(3.498939, 14.801777, 6.893728, 2.090962, 9.192913, 5.059505),
                   l=c(0.8523857, 0.2457656, 0.5381691, 0.6764694, 0.8740950, 1.1761113))
row.names(data) <- c("1-2006", "1-2007", "1-2008", "2-2006", "2-2007", "2-2016")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...