将字符字段中的多个值提取到新数据表中

dwu*_*urf 2 r dataframe

我的数据如下所示:

ids <- c(1,2,3)
titles <- c("Entry1", "Entry2", "Entry3")
tags <- c("<self-help><motivation>", "<programming><r><data.frame>", "<photography>")
df <- data.frame(id = ids, title = titles, tags = tags)
df
Run Code Online (Sandbox Code Playgroud)

输出:

   id  title                         tags
1   1 Entry1      <self-help><motivation>
2   2 Entry2 <programming><r><data.frame>
3   3 Entry3                <photography>
Run Code Online (Sandbox Code Playgroud)

我正在努力将标签提取到新的数据框中.我想要的是第二个数据框,如下所示:

  id         tag
1  1   self-help
2  1  motivation
3  2 programming
4  2           r
5  2  data.frame
6  3 photography
Run Code Online (Sandbox Code Playgroud)

我已经设法使用以下内容对列表执行某些操作,但结果列似乎以某种方式嵌套.我试图unlist()在结果向量中没有效果或产生太多条目.

df$tags_list <- lapply(df$tags, function(x)strsplit(gsub("^.|.$", "", x), "><")[[1]])
Run Code Online (Sandbox Code Playgroud)

我的问题是:有人可以帮我生成这个新的data.frame(或data.table)给出的df,如下所示?任何有关如何处理嵌套列表的智慧的话都非常受欢迎.

Pie*_*une 9

有了base R版本,3.2.0+您可以尝试:

lst <- strsplit(gsub("^<|>$", "", df$tags), split="><")
data.frame(id=rep(df$id, lengths(lst)), tags_list=unlist(lst))
#   id   tags_list
# 1  1   self-help
# 2  1  motivation
# 3  2 programming
# 4  2           r
# 5  2  data.frame
# 6  3 photography
Run Code Online (Sandbox Code Playgroud)

随着gsub("^<|>$"..)我们消除开始和终端支架离开模式"><"作为单词分隔.然后我们使用id和分隔列表创建数据框.

更新

该功能lengths在R 3.2.0中添加,并用于列表length类似的矢量.在它被要求使用之前sapply(lst, length).

  • @Spacedman R 3.2.0中的新功能,比`sapply(x,length)`快得多 (2认同)