我对一些R码有问题。我试图将列中的文本值分类为新列。我的数据是gis.stackexchange站点上使用的标记的集合,它有大约2,500行。我的目标是将标签分类为COTS、FOSS或其他。回顾标签有两种“场景”:一次使用一次的标记(即anaconda)和多次使用的标记(即qgis、qgis-桌面、qgis-服务器等)。对于COTS和FOSS标记来说,这个场景都是正确的。
我的做法是做以下工作:
我得到了一个问题,最后一个grep (COTS)被编码为FOSS。显然有什么问题,但我似乎找不出问题所在。下面是指向源数据的代码和链接。
标签载体- 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,并且只使用第一个元素
我相信这是一个很简单的问题,但我似乎不明白。
发布于 2018-09-19 13:19:52
两件事。首先,您需要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"))))发布于 2018-09-19 13:22:21
用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 otherhttps://stackoverflow.com/questions/52406576
复制相似问题