Как назначить категорию указанным c строкам во фрейме данных R в новом столбце? - PullRequest
1 голос
/ 08 апреля 2020

В наборе данных временного ряда, что было бы хорошим способом сгруппировать наборы строк так, чтобы они имели уникальный идентификатор в новом столбце? Например (очень кратко), взяв это:

library(tidyverse)

data <- read_csv("snippet.csv")

print(data,n=29)

# A tibble: 29 x 5
   Port        Timestamp             MultiPort dev_value dev_unit
   <chr>       <chr>                 <chr>         <dbl> <chr>   
 1 PortConRef1 2/26/2020 12:39:40 PM n            -38.1  ‰       
 2 PortConRef1 2/26/2020 12:39:41 PM n            -38.0  ‰       
 3 PortConRef1 2/26/2020 12:39:42 PM n            -38.2  ‰       
 4 PortConRef1 2/26/2020 12:39:43 PM n            -38.1  ‰       
 5 PortConRef1 2/26/2020 12:39:44 PM n            -38.3  ‰       
 6 PortConRef1 2/26/2020 12:39:45 PM n            -37.9  ‰       
 7 PortConRef1 2/26/2020 12:39:46 PM n            -38.3  ‰       
 8 PortRef1    2/26/2020 12:40:48 PM n             -9.82 ‰       
 9 PortRef1    2/26/2020 12:40:49 PM n            -10.2  ‰       
10 PortRef1    2/26/2020 12:40:50 PM n             -9.75 ‰       
11 PortRef1    2/26/2020 12:40:51 PM n             -9.89 ‰       
12 PortRef1    2/26/2020 12:40:52 PM n            -10.1  ‰       
13 PortRef1    2/26/2020 12:40:53 PM n            -10.1  ‰       
14 PortRef1    2/26/2020 12:40:54 PM n            -10.3  ‰       
15 PortSampleB 2/26/2020 12:51:14 PM n             -5.13 ‰       
16 PortSampleB 2/26/2020 12:51:15 PM n             -4.70 ‰       
17 PortSampleB 2/26/2020 12:51:16 PM n             -4.90 ‰       
18 PortSampleB 2/26/2020 12:51:17 PM n             -5.03 ‰       
19 PortSampleB 2/26/2020 12:51:18 PM n             -4.76 ‰       
20 PortSampleB 2/26/2020 12:52:50 PM y             -5.15 ‰       
21 PortSampleB 2/26/2020 12:52:51 PM y             -4.97 ‰       
22 PortSampleB 2/26/2020 12:52:52 PM y             -5.11 ‰       
23 PortSampleB 2/26/2020 12:52:53 PM y             -4.71 ‰       
24 PortSampleB 2/26/2020 12:58:49 PM y             -5.19 ‰       
25 PortSampleB 2/26/2020 1:00:21 PM  n             -4.75 ‰       
26 PortSampleB 2/26/2020 1:00:22 PM  n             -5.20 ‰       
27 PortSampleB 2/26/2020 1:00:23 PM  n             -4.95 ‰       
28 PortSampleB 2/26/2020 1:00:24 PM  n             -5.06 ‰       
29 PortSampleB 2/26/2020 1:00:25 PM  n             -4.81 ‰ 

# Remove reference gas rows
data2 <- data %>% 
  filter(`Port`=="PortSampleB")

# Convert timestamp column to useable time
library(lubridate)
data2 <- data2 %>% 
  mutate(
    time=mdy_hms(`Timestamp`))

> print(data2,n=15)
# A tibble: 15 x 6
   Port        Timestamp             MultiPort dev_value dev_unit time               
   <chr>       <chr>                 <chr>         <dbl> <chr>    <dttm>             
 1 PortSampleB 2/26/2020 12:51:14 PM n             -5.13 ‰        2020-02-26 12:51:14
 2 PortSampleB 2/26/2020 12:51:15 PM n             -4.70 ‰        2020-02-26 12:51:15
 3 PortSampleB 2/26/2020 12:51:16 PM n             -4.90 ‰        2020-02-26 12:51:16
 4 PortSampleB 2/26/2020 12:51:17 PM n             -5.03 ‰        2020-02-26 12:51:17
 5 PortSampleB 2/26/2020 12:51:18 PM n             -4.76 ‰        2020-02-26 12:51:18
 6 PortSampleB 2/26/2020 12:52:50 PM y             -5.15 ‰        2020-02-26 12:52:50
 7 PortSampleB 2/26/2020 12:52:51 PM y             -4.97 ‰        2020-02-26 12:52:51
 8 PortSampleB 2/26/2020 12:52:52 PM y             -5.11 ‰        2020-02-26 12:52:52
 9 PortSampleB 2/26/2020 12:52:53 PM y             -4.71 ‰        2020-02-26 12:52:53
#...
10 PortSampleB 2/26/2020 12:58:49 PM y             -5.19 ‰        2020-02-26 12:58:49
11 PortSampleB 2/26/2020 1:00:21 PM  n             -4.75 ‰        2020-02-26 13:00:21
12 PortSampleB 2/26/2020 1:00:22 PM  n             -5.20 ‰        2020-02-26 13:00:22
13 PortSampleB 2/26/2020 1:00:23 PM  n             -4.95 ‰        2020-02-26 13:00:23
14 PortSampleB 2/26/2020 1:00:24 PM  n             -5.06 ‰        2020-02-26 13:00:24
15 PortSampleB 2/26/2020 1:00:25 PM  n             -4.81 ‰        2020-02-26 13:00:25    

#note that data from the original dataset has been removed between rows 9 and 10 to ease reproducibility

и присвоив каждому разделу (определяемому по номеру строки или «времени») уникальную категорию букв. В приведенном выше сокращенном примере в сборе данных 1 Гц есть промежуток между строками 5 и 6, соответствующий многопортовому переключению с «n» на «y». Этот шаблон повторяется каждые шесть минут, так что в полном наборе данных есть восемь чередующихся 6-минутных групп «n» и «y» с интервалом 90 секунд. Поскольку это данные с частотой 1 Гц, каждая 6-минутная группа имеет 360 строк.

Мне бы хотелось, чтобы каждые шесть минут y и n имели разные буквенные категории, например от «a» до «h».

Цель состоит в том, чтобы создать отдельный блок-график для данных каждого периода времени, который будет отображаться поверх необработанных данных, который в таком виде выглядит следующим образом:

time series

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Мы можем использовать rleid из data.table, чтобы каждый раз получать уникальный номер MultiPort и использовать его для индексации предопределенного вектора letters.

library(dplyr)
df %>% mutate(cat = letters[data.table::rleid(MultiPort)])
1 голос
/ 08 апреля 2020

Мы можем использовать rle от base R

df$cat <- letters[with(rle(df$MultiPort), rep(seq_along(values), lengths))]
0 голосов
/ 23 апреля 2020

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


#from Ronak's answer
df1 <- df %>% mutate(cat=letters[data.table::rleid(MultiPort)])


df1 %>% 
  ggplot(mapping=aes(x=`time`,y=`dev_value`))+
  geom_point()+
  geom_boxplot(aes(data=cat,fill=MultiPort))+
  ylab("13C vs Intl. Std. (‰)")+
  xlab("Time")+
  theme(legend.text = element_text(size=12),
        legend.title = element_text(size = 14),
        axis.title.x = element_text(size=20),
        axis.title.y = element_text(size=20),
        axis.text.x = element_text(size=14,colour="black"),
        axis.text.y = element_text(size=18,colour="black"),
        legend.box.background = element_rect(color="black", size=2))+
  scale_fill_manual(values=c("dodgerblue1","red"),labels=c("Reference","Sample"))+
  theme(plot.tag.position = c(0.8, 0.02))

plot

...