R: разделить переменные из фрейма данных и найти уникальные - PullRequest
0 голосов
/ 03 июня 2018

У меня есть столбик с 28 строками:

> al
# A tibble: 28 x 1
   lang_name                                               
   <chr>                                                   
 1 Objective-C,Swift,Other                                 
 2 Ruby,Shell                                              
 3 Ruby,HTML,Shell                                         
 4 Java,HTML,Kotlin,Other                                  
 5 TypeScript,JavaScript,CSS,Inno Setup,Shell,HTML         
 6 Vue,JavaScript,CSS,HTML                                 
 7 HTML,JavaScript,CSS                                     
 8 JavaScript,HTML,CSS,Other                               
 9 NA                                                      
10 Vim script,Ruby,Shell,Python,CoffeeScript,Makefile,Other
# ... with 18 more rows

Чувствую, что я получил, нарезав другой фрейм данных с помощью al <- gh[,'lang_name'].Я хочу извлечь данные из каждой строки и поместить их все в один список, чтобы найти уникальные значения.

Как мне это сделать?

Я попытался разбить на al <- str_split(al, ","), но возвращает следующий список:

[[1]]
  [1] "c(\"Objective-C"  "Swift"            "Other\""          " \"Ruby"         
  [5] "Shell\""          " \"Ruby"          "HTML"             "Shell\""         
  [9] " \"Java"          "HTML"             "Kotlin"           "Other\""         
 [13] " \"TypeScript"    "JavaScript"       "CSS"              "Inno Setup"      
 [17] "Shell"            "HTML\""           " \"Vue"           "JavaScript"      
 [21] "CSS"              "HTML\""           " \"HTML"          "JavaScript"      
 [25] "CSS\""            " \"JavaScript"    "HTML"             "CSS"             
 [29] "Other\""          " NA"              " \"Vim script"    "Ruby"            
 [33] "Shell"            "Python"           "CoffeeScript"     "Makefile"        
 [37] "Other\""          " \"PHP\""         " \"JavaScript"    "TypeScript"      
 [41] "Other\""          " \"JavaScript"    "Other\""          " \"JavaScript"   
 [45] "CSS"              "Shell\""          " \"Ruby"          "JavaScript"      
 [49] "HTML"             "Vue"              "CSS"              "Shell\""         
 [53] " \"Go"            "Assembly"         "HTML"             "C"               
 [57] "Shell"            "Perl\""           " \"Go"            "HCL"             
 [61] "Other\""          " \"JavaScript\""  " \"C++"           "JavaScript"      
 [65] "Python"           "Go"               "Shell"            "C\""             
 [69] " \n\"JavaScript"  "CSS"              "HTML"             "Other\""         
 [73] " \"C++"           "Cuda"             "C"                "CMake"           
 [77] "Java"             "Python"           "Other\""          " \"JavaScript"   
 [81] "GLSL\""           " \"JavaScript"    "TypeScript"       "CSS\""           
 [85] " \"Kotlin"        "C"                "Makefile"         "HTML"            
 [89] "C++"              "Java"             "Other\""          " \"Java"         
 [93] "Other\""          " \"Python"        "Jupyter Notebook" "C++"             
 [97] "HTML"             "Shell"            "JavaScript\""     " \"CSS"          
[101] "JavaScript"       "HTML"             "Other\""          " \"HTML"         
[105] "CSS"              "JavaScript\")"   

И unique(al) просто возвращает ту же строку.

Я также пытался поместить все это как символ:

al <- gh[1,'lang_name']
i = 2
while(i < nrow(gh)) {
    al <- paste(al, ",", gh[i+1,'lang_name'])
    i = i + 1
  }
}

Что приводит к следующему символу: [1] "Objective-C,Swift,Other , Ruby,HTML,Shell , Java,HTML,Kotlin,Other , TypeScript,JavaScript,CSS,Inno Setup,Shell,HTML , Vue,JavaScript,CSS,HTML , HTML,JavaScript,CSS , JavaScript,HTML,CSS,Other , NA , Vim script,Ruby,Shell,Python,CoffeeScript,Makefile,Other , PHP , JavaScript,TypeScript,Other , JavaScript,Other , JavaScript,CSS,Shell , Ruby,JavaScript,HTML,Vue,CSS,Shell , Go,Assembly,HTML,C,Shell,Perl , Go,HCL,Other , JavaScript , C++,JavaScript,Python,Go,Shell,C , JavaScript,CSS,HTML,Other , C++,Cuda,C,CMake,Java,Python,Other , JavaScript,GLSL , JavaScript,TypeScript,CSS , Kotlin,C,Makefile,HTML,C++,Java,Other , Java,Other , Python,Jupyter Notebook,C++,HTML,Shell,JavaScript , CSS,JavaScript,HTML,Other , HTML,CSS,JavaScript"

Что я не знаю, как преобразовать в строку для запуска unique на.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Если вам нравятся функции tidyverse / purrr, вы можете сделать это за один шаг.stringr::str_split - это удобная оболочка для stringi::stri_split.purrr::reduce позволяет вам применять функцию, в данном случае c, несколько раз, пока у вас не будет уменьшен весь список векторов, который был возвращен str_split, до одного символьного вектора.unlist из базы R также хорошо работает вместо reduce - у меня очень purrr -привычки с такими задачами, но это не обязательно должно быть по умолчанию для простой задачи.

library(tidyverse)

al$lang_name %>%
  str_split(",") %>%
  reduce(c) %>%
  unique()
#>  [1] "Objective-C"  "Swift"        "Other"        "Ruby"        
#>  [5] "Shell"        "HTML"         "Java"         "Kotlin"      
#>  [9] "TypeScript"   "JavaScript"   "CSS"          "Inno Setup"  
#> [13] "Vue"          NA             "Vim script"   "Python"      
#> [17] "CoffeeScript" "Makefile"

Создано в 2018-06-03 пакетом представ (v0.2.0).

0 голосов
/ 04 июня 2018

Надеюсь, это даст вам то, что вы хотите:

library(tibble)

al <- tibble(lang_name=
c("Objective-C,Swift,Other",                                 
"Ruby,Shell",                                              
"Ruby,HTML,Shell",                                         
"Java,HTML,Kotlin,Other",                          
"TypeScript,JavaScript,CSS,Inno Setup,Shell,HTML",         
"Vue,JavaScript,CSS,HTML",                                 
"HTML,JavaScript,CSS",                                     
"JavaScript,HTML,CSS,Other",                               
NA,                                                      
"Vim script,Ruby,Shell,Python,CoffeeScript,Makefile,Other"))

l1 <- strsplit(al$lang_name,",")
l1

# [[1]]
# [1] "Objective-C" "Swift"       "Other"      
# 
# [[2]]
# [1] "Ruby"  "Shell"
# 
# [[3]]
# [1] "Ruby"  "HTML"  "Shell"
# 
# [[4]]
# [1] "Java"   "HTML"   "Kotlin" "Other" 
# 
# [[5]]
# [1] "TypeScript" "JavaScript" "CSS"        "Inno Setup" "Shell"      "HTML"      
# 
# [[6]]
# [1] "Vue"        "JavaScript" "CSS"        "HTML"      
# 
# [[7]]
# [1] "HTML"       "JavaScript" "CSS"       
# 
# [[8]]
# [1] "JavaScript" "HTML"       "CSS"        "Other"     
# 
# [[9]]
# [1] NA
# 
# [[10]]
# [1] "Vim script"   "Ruby"         "Shell"        "Python"       "CoffeeScript" "Makefile"     "Other"  

l2 <- unlist(l1)
l2
# [1] "Objective-C"  "Swift"        "Other"        "Ruby"         "Shell"        "Ruby"         "HTML"         "Shell"       
# [9] "Java"         "HTML"         "Kotlin"       "Other"        "TypeScript"   "JavaScript"   "CSS"          "Inno Setup"  
# [17] "Shell"        "HTML"         "Vue"          "JavaScript"   "CSS"          "HTML"         "HTML"         "JavaScript"  
# [25] "CSS"          "JavaScript"   "HTML"         "CSS"          "Other"        NA             "Vim script"   "Ruby"        
# [33] "Shell"        "Python"       "CoffeeScript" "Makefile"     "Other" 

l3 <- unique(l2)
l3

# [1] "Objective-C"  "Swift"        "Other"        "Ruby"         "Shell"        "HTML"         "Java"         "Kotlin"      
# [9] "TypeScript"   "JavaScript"   "CSS"          "Inno Setup"   "Vue"          NA             "Vim script"   "Python"      
# [17] "CoffeeScript" "Makefile"
...