在 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'转化为list
, paste
具有 '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
给定这样一个向量:
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'转化为list
, paste
具有 '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