【问题标题】:Problems with shape files形状文件的问题
【发布时间】:2020-06-24 04:25:22
【问题描述】:

我想制作一张美国各州冠状病毒感染者的地图。因此,我们的想法是可视化包含美国所有州的地图,并在所有地图中查看一系列感染者(即 500-2000 等)。这应该由一种颜色的不同深浅来表示。深色部分是冠状病毒病例较多的州。

这是我的代码:

install.packages("sp")
library(sp)

install.packages("sf")
library(sf)

install.packages("maptools")
library(maptools)

install.packages("spdep")
library(spdep)
install.packages("rgdal")
     library(rgdal)
install.packages("RColorBrewer")
library(RColorBrewer)
install.packages("readxl")
library(readxl)




# 
shp_usa <- readOGR("USA_States.shp")
names(shp_usa)                              
shp_usa@data 

# 
infected <- read_excel("C:/Users/josem/OneDrive/Escritorio/infectedUS/CasesUS.xlsx") 
names(infected)      


usa_infected <- shp_usa
usa_infected <- merge(x= shp_usa@data,y= infected,by.x= "STATE_NAME",by.y="State",all.x = TRUE,sort  = FALSE)
summary(usa_infected)



# Map Cases by state USA

    spplot(usa_infected[usa_infected@Cases > 0, ],"Cases.x", at = quantile(usa_infected$Cases.x, p = c(0, .25, .5, .75, 1), na.rm = TRUE), col.regions = brewer.pal(5, "Reds"), main = expression("Cases by State"))

但是我有两个问题: 1.不知道这部分代码到底写了什么:by.x=? by.y=?为了完成任务。

usa_infected <- merge(shp_usa@data,infected,by.x= "STATE_NAME",by.y="State",all.x = TRUE,sort  = FALSE)
  1. 为了可视化地图,我有这个代码
    spplot(usa_infected[usa_infected@Cases > 0, ],"Cases.y", at = quantile(usa_infected$Cases.y, p = c(0, .25, .5, .75, 1), na.rm = TRUE), col.regions = brewer.pal(5, "Reds"), main = expression("Cases by State"))



但是在运行代码后我收到了这条消息:

Error in `[.data.frame`(usa_infected, usa_infected@Cases > 0, ) : 


 trying to get slot "Cases" from an object (class "data.frame") that is not an S4 object 

我有这两个数据集: 1- 这是来自美国的 shp 文件。

 structure(list(STATE_NAME = structure(c(48L, 42L, 51L, 50L, 46L, 
    24L, 38L, 30L, 16L, 22L, 28L, 33L, 39L, 7L, 40L, 31L, 15L, 29L, 
    45L, 5L, 36L, 14L, 9L, 21L, 6L, 18L, 17L, 47L, 26L, 3L, 37L, 
    34L, 43L, 44L, 25L, 11L, 41L, 4L, 19L, 10L, 23L, 12L, 1L, 27L, 
    20L, 35L, 8L, 13L, 2L, 49L, 32L), .Label = c("Alabama", "Alaska", 
    "Arizona", "Arkansas", "California", "Colorado", "Connecticut", 
    "Delaware", "District of Columbia", "Florida", "Georgia", "Hawaii", 
    "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", 
    "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", 
    "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", 
    "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", 
    "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", 
    "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", 
    "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", 
    "West Virginia", "Wisconsin", "Wyoming"), class = "factor"), 
        STATE_FIPS = structure(c(48L, 42L, 51L, 50L, 46L, 24L, 38L, 
        30L, 16L, 22L, 28L, 33L, 39L, 7L, 40L, 31L, 15L, 29L, 45L, 
        5L, 36L, 14L, 9L, 21L, 6L, 18L, 17L, 47L, 26L, 3L, 37L, 34L, 
        43L, 44L, 25L, 11L, 41L, 4L, 19L, 10L, 23L, 12L, 1L, 27L, 
        20L, 35L, 8L, 13L, 2L, 49L, 32L), .Label = c("01", "02", 
        "04", "05", "06", "08", "09", "10", "11", "12", "13", "15", 
        "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", 
        "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
        "36", "37", "38", "39", "40", "41", "42", "44", "45", "46", 
        "47", "48", "49", "50", "51", "53", "54", "55", "56"), class = "factor"), 
        STATE_ABBR = structure(c(48L, 42L, 51L, 49L, 47L, 24L, 38L, 
        31L, 13L, 20L, 30L, 35L, 39L, 7L, 40L, 32L, 16L, 34L, 45L, 
        5L, 36L, 15L, 8L, 21L, 6L, 18L, 17L, 46L, 25L, 4L, 37L, 28L, 
        43L, 44L, 26L, 11L, 41L, 3L, 19L, 10L, 23L, 12L, 2L, 27L, 
        22L, 29L, 9L, 14L, 1L, 50L, 33L), .Label = c("AK", "AL", 
        "AR", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "HI", 
        "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", 
        "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", 
        "NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", "SC", "SD", 
        "TN", "TX", "UT", "VA", "VT", "WA", "WI", "WV", "WY"), class = "factor"), 
        Cases = c(364, 8, 1, 6, 1, 5, 21, 5, 13, 95, 10, 216, 16, 
        3, 5, 15, 6, 7, 2, 157, 4, 19, 10, 9, 33, 8, 1, 9, 1, 6, 
        2, 7, 9, 21, 1, 22, 9, 1, 13, 26, 2, 2, NA, NA, NA, NA, NA, 
        NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
    -51L))

2- 这是受感染的数据库:

structure(list(State = c("Arizona", "Wyoming", "Arkansas", "California", 
"Colorado", "Connecticut", "District of Columbia", "Florida", 
"Georgia", "Hawaii", "Illinois", "Indiana", "Iowa", "Kansas", 
"Kentucky", "Louisiana", "Maryland", "Massachusetts", "Michigan", 
"Minnesota", "Mississippi", "Missouri", "Nebraska", "Nevada", 
"New Hampshire", "New Jersey", "New York", "North Carolina", 
"Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", 
"South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", 
"Vermont", "Virginia", "Washington", "Wisconsin"), Cases = c(6, 
1, 1, 157, 33, 3, 10, 26, 22, 2, 19, 6, 13, 1, 8, 13, 9, 95, strong text
2, 5, 1, 1, 10, 7, 5, 15, 216, 7, 4, 2, 21, 16, 5, 9, 8, 9, 21, 
2, 1, 9, 364, 6)), row.names = c(NA, -42L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

标签: r


【解决方案1】:

首先,不推荐使用 readShapeSpatial,而应该使用 rgdal::readOGR 或 sf::st_read。

回答您的问题:

1:如果您想将新案例分配给 exel 文件中的每个州,则您的合并是正确的。 (形状中已经有案例)。我更喜欢将数据框分配给 by 子句名称以更清楚地显示正在发生的事情),例如:

 merge(x= shp_usa@data,y =infected,by.x= "STATE_NAME",by.y="State",all.x = TRUE,sort  = FALSE)

注意。重复的列名称将更改为链接名称的后缀,即 Cases.x 和 Cases.y

2:由于警告状态“无法为签名‘‘data.frame’’的函数‘spplot’找到继承的方法”,这意味着它正在尝试从 shapefile 的数据帧而不是空间文件进行绘图。这是因为您使用 @data 调用 (usa_infected@data) 调用数据框,请尝试将其更改为:

spplot(usa_infected[usa_infected$Cases.y > 0, ],"Cases.y", at = quantile(usa_infected$Cases.y, p = c(0, .25, .5, .75, 1), na.rm = TRUE), col.regions = brewer.pal(5, "Reds"), main = expression("Cases by State"))

【讨论】:

  • 谢谢你,但让我问你一些事情。所以我需要在所有代码中消除@data?当我这样做时,当我尝试运行最后一行(ssplot)时收到此错误消息。这是错误:[.data.frame(obj@data, zcol) 中的错误:选择了未定义的列
  • 我自己其实没用过spplot,具体要看包和功能需要什么。 obj = 空间数据框 obj@data = 数据框。我的猜测是调用似乎是正确的,你只需要添加一个“,”来定义你需要的列/行。 stackoverflow.com/questions/19205806/…
  • 我已经编辑了帖子。那样可以么?我从代码中删除了@data,但保留了这个:shp_usa@data。我已经定义了列
  • 啊,刚刚看到你更新了帖子。我认为这是因为您使用 usa_infected@Cases。您的两个文件都有一个名为 case 的列,因此 R 将它们重命名。如果您需要 excel 文件中的案例,请尝试 usa_infected@Cases.y。 spplot(usa_infected[usa_infected@Cases > 0, ],"Cases.y", at = quantile(usa_infected$Cases.y, p = c(0, .25, .5, .75, 1), na.rm = TRUE), col.regions = brewer.pal(5, "Reds"), main = expression("Cases by State"))
  • 所以要澄清 Cases.x 是您形状中的 Cases 列,而 Cases.y 是您的 excel 中的案例。我认为重命名它们或删除不需要的将是一种好习惯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多