R:在标题列中使用strsplit

杰伊·韦尔曼

我有一个小标题,其中一栏是字符串。它们是接受调查的人所说的乐器的名称。我想捕获每个乐器,因为它是自己单独的字符串。此列中的值范围从单个字符串(如吉他)到更复杂的答案:唱歌,鼓/打击乐,钢琴/键盘...等等,我尝试过类似的方法:

options <- strsplit(survey$instruments_list, "\\, | \\/ | ")

不幸的是,输出在几个字符串之间仍然具有/字符。

也是最后一个问题,其中一位受访者回答的答案冗长,令人难以置信,而且答案之间用多个空格隔开,我只想要乐器,而不是他们的生活故事。

任何建议将不胜感激,谢谢!编辑:dput(head(survey))的结果

structure(list(time_submitted = c("8/27/19 20:22", "8/29/19 12:15", 
"8/28/19 19:33", "8/29/19 16:25", "8/27/19 15:40", "8/27/19 22:59"
), pseudonym_generator = c("Fake rapper name generator", "Fake band name generator", 
"Fake band name generator", "Fake band name generator", "Fake band name generator", 
"Fake band name generator"), pseudonym = c("Lord Los Angeles", 
"Heroes War", "Puppets War", "West Magic", "Eller Angel", "Trace Stripes"
), sex = c("Male", "Male", "Male", "Male", "Male", "Male"), academic_major = c("Computer Science", 
"Computer Science", "Math", "Computer Science", "Computer Science", 
"Computer Science"), academic_level = c("Senior", "Junior", "Senior", 
"Junior", "Senior", "Senior"), year_born = c(1994, 1997, 1996, 
1999, 1998, 1986), instrument_list = c("Rap", "Guitar", "Guitar", 
"Trumpet", "Piano/Keyboards, Ukulele", NA), favorite_song_artist = c("40 crew", 
"Arctic Monkeys", "Avatar", "Ben Folds", "blink-182", "brian jonestown massacre / sarabeth tucek"
), favorite_song = c("Not Enough", "Arabella", "The Eagle Has Landed", 
"Still", "She's Out Of Her Mind", "Seer"), favorite_song_link = c("https://www.youtube.com/watch?v=uITuGZKljgQ", 
"https://www.youtube.com/watch?v=Jn6-TItCazo", "https://www.youtube.com/watch?v=4p6GWewmTYQ", 
"https://www.youtube.com/watch?v=ShBzUK4rnI8", "https://www.youtube.com/watch?v=krpm0v_486k", 
"https://youtu.be/C-XT7DZsNP8")), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -6L))
r2evans

这个怎么样:

library(dplyr)
library(tidyr)
survey %>%
  transmute(pseudonym, inst = strsplit(instrument_list, "[,/]")) %>%
  filter(!is.na(inst)) %>%
  unnest() %>%
  mutate(inst = trimws(inst), plays = TRUE) %>%
  spread(inst, plays) %>%
  mutate_at(vars(-pseudonym), Negate(is.na))
# # A tibble: 5 x 7
#   pseudonym        Guitar Keyboards Piano Rap   Trumpet Ukulele
#   <chr>            <lgl>  <lgl>     <lgl> <lgl> <lgl>   <lgl>  
# 1 Eller Angel      FALSE  TRUE      TRUE  FALSE FALSE   TRUE   
# 2 Heroes War       TRUE   FALSE     FALSE FALSE FALSE   FALSE  
# 3 Lord Los Angeles FALSE  FALSE     FALSE TRUE  FALSE   FALSE  
# 4 Puppets War      TRUE   FALSE     FALSE FALSE FALSE   FALSE  
# 5 West Magic       FALSE  FALSE     FALSE FALSE TRUE    FALSE  

将多种工具组合成一个类别并不难。我将采用您的其中一种乐器进行演示。

一种方法是使用case_when,也许这两种方法中的更直接/更直观:

survey %>%
  mutate(instrument_list = if_else(grepl("Lord", pseudonym), "Electric Guitar", instrument_list)) %>%
  transmute(pseudonym, inst = strsplit(instrument_list, "[,/]")) %>%
  filter(!is.na(inst)) %>%
  unnest() %>%
  mutate(inst = trimws(inst), plays = TRUE) %>%
  spread(inst, plays) %>%
  mutate_at(vars(-pseudonym), Negate(is.na))
# # A tibble: 5 x 7
#   pseudonym        `Electric Guitar` Guitar Keyboards Piano Trumpet Ukulele
#   <chr>            <lgl>             <lgl>  <lgl>     <lgl> <lgl>   <lgl>  
# 1 Eller Angel      FALSE             FALSE  TRUE      TRUE  FALSE   TRUE   
# 2 Heroes War       FALSE             TRUE   FALSE     FALSE FALSE   FALSE  
# 3 Lord Los Angeles TRUE              FALSE  FALSE     FALSE FALSE   FALSE  
# 4 Puppets War      FALSE             TRUE   FALSE     FALSE FALSE   FALSE  
# 5 West Magic       FALSE             FALSE  FALSE     FALSE TRUE    FALSE  

survey %>%
  mutate(instrument_list = if_else(grepl("Lord", pseudonym), "Electric Guitar", instrument_list)) %>%
  transmute(pseudonym, inst = strsplit(instrument_list, "[,/]")) %>%
  filter(!is.na(inst)) %>%
  unnest() %>%
  mutate(
    inst = case_when(
      grepl("\\bPiano\\b", inst, ignore.case = TRUE) ~ "Piano",
      grepl("\\bUkelete\\b", inst, ignore.case = TRUE) ~ "Ukelele",
      grepl("\\bGuitar\\b", inst, ignore.case = TRUE) ~ "Guitar",
      TRUE ~ trimws(inst)),
    plays = TRUE,
  ) %>%
  spread(inst, plays) %>%
  mutate_at(vars(-pseudonym), Negate(is.na))
# # A tibble: 5 x 6
#   pseudonym        Guitar Keyboards Piano Trumpet Ukulele
#   <chr>            <lgl>  <lgl>     <lgl> <lgl>   <lgl>  
# 1 Eller Angel      FALSE  TRUE      TRUE  FALSE   TRUE   
# 2 Heroes War       TRUE   FALSE     FALSE FALSE   FALSE  
# 3 Lord Los Angeles TRUE   FALSE     FALSE FALSE   FALSE  
# 4 Puppets War      TRUE   FALSE     FALSE FALSE   FALSE  
# 5 West Magic       FALSE  FALSE     FALSE TRUE    FALSE  

另一种方法(如果您还有更多方法)是合并/加入框架。这样做的一个优点是它可以非常具体,并且包含非常不同的工具(其中regex可能比您要处理的更多)。一个缺点是它可能太具体了……例如,不会拼写错误或区分大小写。

gen_inst <- tibble::tribble(
  ~inst, ~newinst
 ,"Electric Guitar", "Guitar"
 ,"Electric Bass"  , "Guitar"
 ,"Electric Piano" , "Piano"
 ,"Pipe Organ"     , "Piano"
)

survey %>%
  mutate(instrument_list = if_else(grepl("Lord", pseudonym), "Electric Guitar", instrument_list)) %>%
  transmute(pseudonym, inst = strsplit(instrument_list, "[,/]")) %>%
  filter(!is.na(inst)) %>%
  unnest() %>%
  left_join(gen_inst, by = "inst") %>%
  mutate(
    inst = if_else(is.na(newinst), trimws(inst), newinst),
    plays = TRUE
  ) %>%
  select(-newinst) %>%
  spread(inst, plays) %>%
  mutate_at(vars(-pseudonym), Negate(is.na))
# # A tibble: 5 x 6
#   pseudonym        Guitar Keyboards Piano Trumpet Ukulele
#   <chr>            <lgl>  <lgl>     <lgl> <lgl>   <lgl>  
# 1 Eller Angel      FALSE  TRUE      TRUE  FALSE   TRUE   
# 2 Heroes War       TRUE   FALSE     FALSE FALSE   FALSE  
# 3 Lord Los Angeles TRUE   FALSE     FALSE FALSE   FALSE  
# 4 Puppets War      TRUE   FALSE     FALSE FALSE   FALSE  
# 5 West Magic       FALSE  FALSE     FALSE TRUE    FALSE  

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在R中使用strsplit提取特定字符串

来自分类Dev

使用strsplit添加新列

来自分类Dev

在jqGrid列标题中使用图标?

来自分类Dev

在 R 中使用 LaTeX 获取图例或标题

来自分类Dev

使用str_replace_all循环数据并在R中使用strsplit

来自分类Dev

r 闪亮:在文本文件中使用 write.table 创建列标题

来自分类Dev

如何在R中使用strsplit创建字符串向量?

来自分类Dev

从SQL查询中使用列别名为Excel列标题

来自分类Dev

在Ignite Grid的列标题中使用输入控件

来自分类Dev

在 Pandas 中使用列值和标题并自动填充表

来自分类Dev

在 Excel 中使用宏替换列标题文本

来自分类Dev

在R中使用pandoc时如何强调列名(标题)

来自分类Dev

在R中使用colnames()在循环中更改图的标题

来自分类Dev

在R中使用Rvest从表中删除多个标题行

来自分类Dev

如何在R中使用胶水在情节的标题/字幕中使用变量的最大值?

来自分类Dev

R:列标题转换

来自分类Dev

R中数据框中的选择strsplit列的总和

来自分类Dev

R:使用 rbind 时重新打印列标题

来自分类Dev

在GridView中使用自动生成的列提取列数和标题文本

来自分类Dev

在 angularJs 中使用 ag-grid 面临基于隐藏和显示列功能的列标题问题

来自分类Dev

如何使用strsplit()访问R列表中的元素?

来自分类Dev

R strsplit 使用正则表达式

来自分类Dev

在R中使用枢轴堆叠更多列

来自分类Dev

在R中使用dplyr划分多列

来自分类Dev

在R中使用dplyr划分多列

来自分类Dev

在 R 中使用 `dplyr` 识别列排名

来自分类Dev

Gnuplot标题-使用sprintf在标题中使用变量

来自分类Dev

在标题中使用“ /”时,如何防止列不显示在WPF数据网格中?

来自分类Dev

在Java中使用列标题创建自定义表模型

Related 相关文章

  1. 1

    在R中使用strsplit提取特定字符串

  2. 2

    使用strsplit添加新列

  3. 3

    在jqGrid列标题中使用图标?

  4. 4

    在 R 中使用 LaTeX 获取图例或标题

  5. 5

    使用str_replace_all循环数据并在R中使用strsplit

  6. 6

    r 闪亮:在文本文件中使用 write.table 创建列标题

  7. 7

    如何在R中使用strsplit创建字符串向量?

  8. 8

    从SQL查询中使用列别名为Excel列标题

  9. 9

    在Ignite Grid的列标题中使用输入控件

  10. 10

    在 Pandas 中使用列值和标题并自动填充表

  11. 11

    在 Excel 中使用宏替换列标题文本

  12. 12

    在R中使用pandoc时如何强调列名(标题)

  13. 13

    在R中使用colnames()在循环中更改图的标题

  14. 14

    在R中使用Rvest从表中删除多个标题行

  15. 15

    如何在R中使用胶水在情节的标题/字幕中使用变量的最大值?

  16. 16

    R:列标题转换

  17. 17

    R中数据框中的选择strsplit列的总和

  18. 18

    R:使用 rbind 时重新打印列标题

  19. 19

    在GridView中使用自动生成的列提取列数和标题文本

  20. 20

    在 angularJs 中使用 ag-grid 面临基于隐藏和显示列功能的列标题问题

  21. 21

    如何使用strsplit()访问R列表中的元素?

  22. 22

    R strsplit 使用正则表达式

  23. 23

    在R中使用枢轴堆叠更多列

  24. 24

    在R中使用dplyr划分多列

  25. 25

    在R中使用dplyr划分多列

  26. 26

    在 R 中使用 `dplyr` 识别列排名

  27. 27

    Gnuplot标题-使用sprintf在标题中使用变量

  28. 28

    在标题中使用“ /”时,如何防止列不显示在WPF数据网格中?

  29. 29

    在Java中使用列标题创建自定义表模型

热门标签

归档