首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中对标记进行分类和在ifelse中使用grepl

在R中对标记进行分类和在ifelse中使用grepl
EN

Stack Overflow用户
提问于 2018-09-19 13:05:55
回答 2查看 714关注 0票数 0

我对一些R码有问题。我试图将列中的文本值分类为新列。我的数据是gis.stackexchange站点上使用的标记的集合,它有大约2,500行。我的目标是将标签分类为COTS、FOSS或其他。回顾标签有两种“场景”:一次使用一次的标记(即anaconda)和多次使用的标记(即qgis、qgis-桌面、qgis-服务器等)。对于COTS和FOSS标记来说,这个场景都是正确的。

我的做法是做以下工作:

  1. 使用表示FOSS的所有标记创建一个向量
  2. 创建一个包含所有表示COTS的标记的向量
  3. 使用ifelse创建一个名为“软件和代码”的新列
  4. 如果tagName在% FOSS中为%,那么将其编码为FOSS
  5. 在ifelse中,在FOSS向量上使用grep进行模式匹配标记,这些标记可以多次使用(即qgis),代码作为FOSS使用。
  6. 为COTS重复此操作

我得到了一个问题,最后一个grep (COTS)被编码为FOSS。显然有什么问题,但我似乎找不出问题所在。下面是指向源数据的代码和链接。

与源CSV共享文件夹

标签载体- FOSS和COTS

代码语言:javascript
复制
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")

创建基于标记向量计算的分类值的新列

代码语言:javascript
复制
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,并且只使用第一个元素

我相信这是一个很简单的问题,但我似乎不明白。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-19 13:19:52

两件事。首先,您需要grepl(),因为它具有逻辑输出。其次,grepl()不适用于字符向量,因此您需要像这个"anaconda|android|..."那样折叠它,并省略fixed = TRUE才能工作。

这应该可以做到:

代码语言:javascript
复制
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"))))
票数 1
EN

Stack Overflow用户

发布于 2018-09-19 13:22:21

tidyverse

代码语言:javascript
复制
 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52406576

复制
相关文章

相似问题

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