问题描述
给定这样一个向量:
c("node 1","primary","sports,improve","music,"painting,"surrogate","music","node 2","node 3",improve")
我想将每个“主要”及其对应节点下的每个名称作为单个字符串。例如:对于第一个节点,即上面向量中的第一个元素(“节点 1”),应该有三个输出:“节点 1 体育”、“节点 1 音乐”、“节点 1 绘画”。对于“节点 2”,应该有两个:“节点 2 音乐”、“节点 2 绘画”。数据比给定的向量大得多,因此索引和手动生成字符串不是首选。我最初的想法是用 grepl 找到每个包含“改进”的元素。我找不到将使用 grepl 找到的元素分配给其对应节点的方法。
解决方法
根据'node'的出现次数创建一个组,得到逻辑向量的cumsum
,split
将向量'v1'变成一个list
,paste
具有“改进”和 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