首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用包含数据字符串的字符变量转换`data.frame`

使用包含数据字符串的字符变量转换`data.frame`
EN

Stack Overflow用户
提问于 2022-10-08 04:26:40
回答 2查看 50关注 0票数 2

我有一个包含字符变量的data.frame,它有一个额外的元数据字符串(某种程度上是键值格式),我希望这些元数据在data.frame中作为变量使用;元数据变量充满了细微差别和不一致之处:其中一些元数据具有不同长度的多个值(一个数组),并不是所有的观测都有所有附加数据(因此需要是空的或NA),一些元数据类别是重复的,或者有时在更结构化的元数据之前有“未分类的”值(这些值可以被忽略/删除)。

一个更有代表性的示例--说明tags中所述不一致的例子。

代码语言:javascript
运行
复制
dat <- data.frame(title = c("How To", "Why To", "When To"),
                  id = c("001", "005", "102"),
                  tags = c("Type: Article,  Topics: solo, Length: 3.5, Topics: self help, DIY",
                           "case study, thinking, English, Type: Paper, Topics: philosophy",
                           "Language: EN, Type: Checklist, Topics: scheduling, time-management"))  

所需的输出将是一个data.frame (或类似于tibble),例如:

代码语言:javascript
运行
复制
#>           title          id   tags  Language        Type Length                             Topics
#>                 <chr>       <chr>  <chr>     <chr>       <chr>  <int>                        <chr>
#> 1        How To         001    ...        NA     Article    3.5               solo, self help, DIY
#> 2        Why To         005    ...        NA       Paper     NA                         philosophy
#> 3       When To         102    ...        EN   Checklist     NA        scheduling, time-management

注意:我用...表示dat中的原始字符串;在修改问题之前,我还使用了部分提供的解决方案,通过:gsub("(^.[^:]*, )(?=[[:alpha:]]+:)", "", tags, perl = T)删除“未分类”值

最好采用tidyr方法,但鉴于我将类似问题的各种解决方案拼凑在一起,我只得到了一点帮助,任何解决方案都会有所帮助。

EN

Stack Overflow用户

发布于 2022-10-08 08:42:45

answer from Jon Spring上进行扩展,但使用一个rex例来区分逗号的两种用法:

代码语言:javascript
运行
复制
library(dplyr)
library(tidyr)
dat %>% 
  separate_rows(tags, sep = "(, )(?=[[:alpha:]]+:)") %>% 
  separate(tags, into = c("header", "value"), fill = "left", sep = ": ") %>% 
  pivot_wider(names_from = header, values_from = value)
#> # A tibble: 3 × 6
#>   title   id    Type      Length Topics                      Language
#>   <chr>   <chr> <chr>     <chr>  <chr>                       <chr>   
#> 1 How To  001   Article   3.5    self help, DIY              <NA>    
#> 2 Why To  005   Paper     <NA>   philosophy                  <NA>    
#> 3 When To 102   Checklist <NA>   scheduling, time-management EN

regex标识所有, (逗号带有空格),后面跟着一个或多个字母([[:alpha:]]++表示一个或多个字母),后面跟着一个:

如果要保留旧标记,只需在带有mutate(old_tag = tags) %>%的行之前添加一行separate_rows即可。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73994368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档