如何从 R 中的字符向量中进行更简洁的提取?

How do I make a more concise extraction from a character vector in R?

我们使用 google 日历来预订多台机器,我正在绘制使用情况图表。我有一行来提取用于绘图的日历的标题,但它看起来相当长和笨重,使用 grep 两次(一次用于日历名称的索引,一次用于提取日历的名称)。我不想假设日历的名称将始终位于同一索引处。日历数据作为 .ics 文件下载并使用 read_lines() 从 tidyverse 导入。有没有更简洁的获取日历名称的方法?

> calendar_raw[1:20]
 [1] "BEGIN:VCALENDAR"                                         
 [2] "PRODID:-//Google Inc//Google Calendar 70.9054//EN"       
 [3] "VERSION:2.0"                                             
 [4] "CALSCALE:GREGORIAN"                                      
 [5] "METHOD:PUBLISH"                                          
 [6] "X-WR-CALNAME:Calendar Name"                  
 [7] "X-WR-TIMEZONE:America/Los_Angeles"                       
 [8] "X-WR-CALDESC:Schedule for the machine"
 [9] "BEGIN:VEVENT"                                            
[10] "DTSTART:20180223T210000Z"                                
[11] "DTEND:20180223T220000Z"                                  
[12] "DTSTAMP:20220421T162943Z"                                
[13] "UID:unimportant@google.com"               
[14] "CREATED:20180222T195641Z"                                
[15] "DESCRIPTION:"                                            
[16] "LAST-MODIFIED:20180222T200100Z"                          
[17] "LOCATION:"                                               
[18] "SEQUENCE:0"                                              
[19] "STATUS:CONFIRMED"                                        
[20] "SUMMARY:Username"   

> gsub("X-WR-CALNAME:(.*$)","\1", calendar_raw[grep("X-WR-CALNAME:",calendar_raw)])
[1] "Calendar Name"          

你还需要grep包含X-WR-CALNAME:的字符向量,然后删除它,所以你有就可以了。

你能做的是

  • 使用 sub 因为您只使用一个搜索和替换操作
  • 您的正则表达式中不需要 $,并且您确实不需要使用 X-WR-CALNAME: 之后的其余字符串以稍后使用 </code> 反向引用进行恢复。如果一定要留下来,就不要消耗它,<code>sub操作不会触及它。

因此您可以使用

sub("^X-WR-CALNAME:", "", calendar_raw[grep("X-WR-CALNAME:", calendar_raw)])