Классификация тегов в R с помощью grepl в ifelse - PullRequest
0 голосов
/ 19 сентября 2018

У меня проблема с кодом RЯ пытаюсь классифицировать текстовые значения из столбца в новый столбец.Мои данные представляют собой набор тегов, используемых на сайте gis.stackexchange, который содержит ~ 2500 строк.Моя цель - классифицировать теги как COTS, FOSS или другие.При просмотре тегов есть два «сценария»;теги, которые используются один раз (т. е. anaconda) и теги, для которых термин используется несколько раз (например, qgis, qgis-desktop, qgis-server и т. д.).Этот сценарий верен как для тегов COTS, так и для тегов FOSS.

Мой подход заключался в следующем:

  1. создать вектор со всеми тегами, представляющими FOSS
  2. createвектор со всеми тегами, представляющими COTS
  3. , создает новый столбец, называемый программным обеспечением и кодом, используя ifelse
  4. ifelse - где tagName равно% в% FOSS, а затем кодируется как FOSS
  5. в ifelse используйте grep для вектора FOSS для сопоставления тегов соответствия, которые можно использовать несколько раз (например, qgis), и используйте код FOSS
  6. Повторите это для COTS

Я получаюпроблема, когда последний grep (COTS) кодируется как FOSS.Очевидно, что-то не так, но я не могу понять проблему.Ниже приведен код и ссылка на исходные данные.

Общая папка с исходным CSV

Векторы тегов - FOSS и COTS

foss <- c("anaconda", "android", "apache", "aptana", "google", "blender", "cordova", 
          "docker", "drupal", "eclipse", "facebook", "firefox", "ftools", "fwtools", 
          "geodjango", "geopandas", "geomoose", "geonetwork", "geonode", "geotools", 
          "ggmap", "ggplot2", "gimp", "github", "gme", "chrome", "gvsig", "h2gis", 
          "hadoop", "inkscape", "lastools", "laszip", "mongodb", "neo4j", "numpy", 
          "open-data-kit", "opencv", "opendronemap", "openev", "opengeo-suite-composer", 
          "opengl", "openjump", "openstreetmap", "opentopomap", "opentripplanner", "openwind", 
          "orfeo-toolbox", "pandas", "pdal", "pgrouting", "pg2shape", "phonegap", 
          "plpgsql", "ppygis", "pydev", "pygdal", "pyproj", "pyqspatialite", "rasterlite", 
          "raster2pgsql", "rdal", "saga", "shapely", "shp2pgsql", "sp", "sf", 
          "spatialite-gui", "three-js", "unity3d", "wordpress", "youtube", "bing-maps", 
          "dropbox", "instagram", "sketchup", "carto", "django", "gdal", "geoserver", 
          "grass", "jupyter", "leaflet", "mapbox", "matplotlib", "mysql", "ogr", "openlayers", 
          "osgeo", "osm", "pgadmin", "postgis", "postgresql", "proj4", "pyqgis", "qgis", 
          "qt", "scikit", "scipy", "tilemill")

cots <- c("autodesk", "bentley", "cityengine", "drone2map", "ecognition", "envi", "er-mapper", 
          "et-geowizards", "excel", "geomatica", "geosoft", "global-mapper", "illustrator", 
          "mac", "matlab", "microstation", "modelbuilder", "pix4d", "plsql", "powerpoint", 
          "silverlight", "spss", "tableau", "xtools-pro", "mapinfo", "arc", "oracle", 
          "erdas", "esri", "fme", "microsoft", "-analyst")

Создать новый столбец с классифицированными значениями, рассчитанными на основе вектора тега

tags$software <- ifelse(tags$tagName %in% foss, "FOSS", 
ifelse(grep(foss, tags$tagName, fixed = TRUE), "FOSS",
ifelse(tags$tagName %in% cots, "COTS", 
ifelse(grep(cots, tags$tagName, fixed = TRUE), "COTS", 
  "other"))))

Когда я запускаю код, выдается следующая ошибка: аргумент 'pattern' имеет длину> 1, и только первый элемент будетб

Я уверен, что это очень простая проблема, но я не могу понять это.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

С tidyverse:

 tags<-data.frame(tagName=c("opengl","openglGHSAJKGNKS","arc","arc93257","asnsgn"))
 tags%>%
   mutate(software = case_when(
     tagName %in% foss ~ "FOSS",
     grepl(paste(foss,collapse="|"),tagName) ~ "FOSS",
     tagName %in% cots ~ "COTS",
     grepl(paste(cots,collapse="|"), tagName) ~ "COTS",
     T ~ "other"))

           tagName software
1           opengl     FOSS
2 openglGHSAJKGNKS     FOSS
3              arc     COTS
4         arc93257     COTS
5           asnsgn    other
0 голосов
/ 19 сентября 2018

Две вещи.Прежде всего, вам нужно grepl() из-за логического вывода.Во-вторых, grepl() не работает с вектором символов, поэтому вам нужно свернуть его вот так "anaconda|android|..." и пропустить fixed = TRUE для работы.

Это должно сделать это:

tags$software <- ifelse(tags$tagName %in% foss, "FOSS", 
                        ifelse(grepl(paste(foss, collapse = "|"), tags$tagName), "FOSS",
                               ifelse(tags$tagName %in% cots, "COTS", 
                                      ifelse(grepl(paste(cots, collapse = "|"), tags$tagName), "COTS", 
                                             "other"))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...