r - 从一个字符字段中提取多个值到一个新的数据表中

标签 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

输出:

   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/

相关文章:

r - 找到三个或更多连续的负数并从数据框中删除行

python - 如何将pandas数据帧转换为具有rdd属性的pyspark数据帧?

r - 在给定列上聚合数据框并显示另一列

删除边距并更改 ggplot 中标签的字体样式

python - 如何计算列的平均值但只包括某些行?

python - 通过提取 DatetimeIndex 的时间而不使用 for 循环,在一个图上绘制每一天

r - 计算行的平均值,排除每行中的最高值和最低值

r - 如何在 Linux 中使用命令行从具有特定扩展名的目录中删除文件

基于三列删除数据框中的行

python - 使用 foreach 方法处理旧数据帧创建新的 pyspark 数据帧时出现 Pickle 错误