I have looked at several related questions, but have not found a working solution beginning with a DataFrame of vertices for multiple polygons. There are existing solutions that address shapefiles where each polygon is contained in a single row.
My issue is the output of gCentroid is clearly weighted toward uneven boundaries. It seems to be generating the mean of the polygon vertices rather than the expected centroid.
library(ggplot2); library(maps); library(sp); library(rgeos) county_df <- map_data('county') #mappings of counties by state county_df <- subset(county_df, region %in% c("illinois", "indiana", 'michigan', 'minnesota', 'wisconsin')) #subset just for GL county_df$county <- county_df$subregion county_df_plot <- county_df coordinates(county_df) <- c("long", "lat") # Get centroids ctrs <- lapply(unique(county_df$group), function(x) gCentroid(SpatialPoints(county_df[county_df$group==x,]))) ctrsout <- setNames( ctrs , unique(county_df$group ) ) # Create data frame centroid_df <- do.call(rbind, lapply(ctrsout, data.frame, stringsAsFactors=FALSE)) uniq_logical <- !duplicated(county_df$group) centroid_df$state <- county_df$region[uniq_logical] centroid_df$county <- county_df$county[uniq_logical] names(centroid_df) <- c("longitude", "latitude",'state', 'county') ggplot(county_df_plot, aes(long, lat)) + geom_polygon(aes(group=group), colour='black', fill=NA) + geom_point(data=centroid_df, aes(longitude, latitude), size=1)