我的数据如下所示:
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
输出:
id title tags
1 1 Entry1 <self-help><motivation>
2 2 Entry2 <programming><r><data.frame>
3 3 Entry3 <photography>
我正在努力将标签提取到新的数据框中。我想要的是第二个数据框,如下所示:
id tag
1 1 self-help
2 1 motivation
3 2 programming
4 2 r
5 2 data.frame
6 3 photography
我已经设法使用以下列表对列表进行某事,但生成的列似乎以某种方式嵌套。我对 unlist()
的尝试要么没有效果,要么在结果向量中产生了太多条目。
df$tags_list <- lapply(df$tags, function(x)strsplit(gsub("^.|.$", "", x), "><")[[1]])
我的问题是:有人可以帮我生成这个新的 data.frame
(或 data.table
)给定 df
如下所示?也非常感谢任何关于如何处理嵌套列表的智慧之言。
最佳答案
与 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
与 gsub("^<|>$"..)
我们消除了开头和结尾的括号,留下了模式 "><"
作为单词分隔符。然后我们使用 id 和分隔列表创建数据框。
更新
函数lengths
在 R 3.2.0 中添加并为列出什么 length
做了什么对于向量也是如此。在需要使用 sapply(lst, length)
之前.
关于r - 从一个字符字段中提取多个值到一个新的数据表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32951389/