【问题标题】:Classifying tags in R with grepl in ifelse使用 ifelse 中的 grepl 对 R 中的标签进行分类
【发布时间】:2018-09-19 13:05:55
【问题描述】:

我遇到了一些 R 代码问题。我正在尝试将列中的文本值分类到新列中。我的数据是 gis.stackexchange 网站上使用的标签集合,该网站有大约 2,500 行。我的目标是将标签分类为 COTS、FOSS 或其他。查看标签有两个“场景”;使用一次的标签(即 anaconda)和一个术语多次使用的标签(即 qgis、qgis-desktop、qgis-server 等)。这种情况适用于 COTS 和 FOSS 标签。

我的方法是执行以下操作:

  1. 创建一个包含所有代表 FOSS 的标签的向量
  2. 创建一个包含所有代表 COTS 的标签的向量
  3. 使用 ifelse 创建一个名为 software and code 的新列
  4. ifelse - 其中 tagName 是 %in% FOSS 然后编码为 FOSS
  5. 在 ifelse 中,在 FOSS 向量上使用 grep 来模式匹配可能多次使用的标签(即 qgis)并编码为 FOSS
  6. 对 COTS 重复此操作

我遇到了一个问题,即最后一个 grep (COTS) 被编码为 FOSS。显然有问题,但我似乎无法弄清楚问题所在。下面是代码和源数据的链接。

Shared folder with source 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"))))

当我运行代码时,会产生以下错误:argument 'pattern' has length > 1 and only the first element will be used

我确信这是一个非常简单的问题,但我似乎无法弄清楚。

【问题讨论】:

  • 我建议你创建一个smaller reproducible example。你已经发布了完整的数据,但是一个小例子更容易理解,也可以帮助你理解答案;)

标签: r if-statement


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    两件事。首先,由于逻辑输出,您需要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"))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-18
      • 2019-02-24
      • 2020-12-16
      • 1970-01-01
      • 2011-07-29
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多