在 R 中找到与特定模式匹配的最接近的前一个元素

Find the closest previous element that matches a certain pattern in R

给定这样一个向量:

c("node 1",
  "primary",
  "sports, improve",
  "music, improve",
  "painting, improve",
  "surrogate",
  "music",
  "node 2", 
  "primary", 
  "music, improve",
  "painting, improve",
  "node 3", 
  "primary",
  "sports, improve")

我想将每个“主要”下的每个名称及其对应的节点作为单个字符串获取。例如:对于第一个节点,即上面向量中的第一个元素(“节点 1”),应该有三个输出:“节点 1 体育”、“节点 1 音乐”、“节点 1 绘画”。对于“节点 2”,应该有两个:“节点 2 音乐”、“节点 2 绘画”。数据比给定的向量大得多,因此索引和手动生成字符串不是首选。我最初的想法是用 grepl 找到每个包含“改进”的元素。我找不到将使用 grepl 找到的元素分配给其对应节点的方法。

根据'node'的出现创建一个组,得到cumsum的逻辑向量,split将向量'v1'转化为listpaste 具有 'improve' 和 stack 元素子串的第一个元素为两列 data.frame

stack(lapply(split(v1, cumsum(grepl('node', v1))), 
   function(x) paste(x[1], sub(",.*", "", x[grep('improve', x)]))))[2:1]

-输出

#  ind          values
#1   1   node 1 sports
#2   1    node 1 music
#3   1 node 1 painting
#4   2    node 2 music
#5   2 node 2 painting
#6   3   node 3 sports