【问题标题】:Join two columns into one in a SpatialDataFrame, but omitting NAs In R在 SpatialDataFrame 中将两列合并为一列,但在 R 中省略 NA
【发布时间】:2020-06-17 08:19:39
【问题描述】:

我正在尝试使用 R 程序将 SpatialDataFrame (shapefile) 的两列合并为一列,但是在两列中都有空格,当它们与名称加 NA 一起时,但是我不希望 NA出现在我的新专栏中。我使用了粘贴功能。 像这样:

  This is the structure of my SpatialDataFrame:


  ID           city                city2
1  1      saõ paulo                 <NA>
2  2      Rio de Janeiro            <NA>
3  3           <NA>            Belo Horizonte
4  4           <NA>            Curitiba

obs。我的原始数据不是这个并且有更多的列

我用过这个:

data$newCity <- paste(data$city, data$city2) # I don't want to show in my data Na

1.

ID          city          city2                newCity
  1      saõ paulo         <NA>            saõ paulo NA
  2  Rio de Janeiro        <NA>            Rio de Janeiro NA
  3        <NA>       Belo Horizonte       NA Belo Horizonte
  4        <NA>       Curitiba             NA Curitiba

事实上,这将是期望的结果:

ID          city          city2                 newCity
 1      saõ paulo         <NA>                saõ paulo
 2    Rio de Janeiro      <NA>               Rio de Janeiro
 3        <NA>         Belo Horizonte         Belo Horizonte
 4        <NA>          Curitiba              Curitiba

【问题讨论】:

标签: r dataframe join na spatial-data-frame


【解决方案1】:

使用paste 将字符列粘合在一起,用空格分隔,即“_”。试试这个:

data$newCity <- ifelse(is.na(data$city), data$city2, data$city)

【讨论】:

  • 嗨,谢谢,我尝试使用此代码,但没有成功,看看返回了什么:ID city city2 newCity 1 1 saõ paulo 2 2 2 Rio de Janeiro 1 3 4 贝洛奥里藏特 1 4 5 库里提巴 2
  • 看起来字符列实际上是因素。您可以使用str(data) 进行检查,它会显示变量的类型。如果某些因素对我有用:df$newCity &lt;- ifelse(is.na(as.character(df$city)), as.character(df$city2), as.character(df$city))。最好的解决方案是在加载数据后将因子转换为字符列。
【解决方案2】:

你可以使用dplyr包中的coalesce函数:

df <- data.frame(ID = 1:4,
                 city = c("sao paulo", "rio de janeiro", NA, NA),
                 city2 = c(NA, NA, "Belo Horizonte", "Curitiba"), stringsAsFactors = FALSE)


library(dplyr)
df %>% mutate(City = coalesce(city, city2))
  ID           city          city2           City
1  1      sao paulo           <NA>      sao paulo
2  2 rio de janeiro           <NA> rio de janeiro
3  3           <NA> Belo Horizonte Belo Horizonte
4  4           <NA>       Curitiba       Curitiba

【讨论】:

  • 返回以下错误:UseMethod("mutate_") 中的错误:没有适用于 'mutate' 的方法应用于类“c('SpatialPolygonsDataFrame', ' SpatialPolygons', 'Spatial', 'SpatialVector')"_,我想是因为我的真实数据是一个spatialDataframe
  • 我想它确实与你的SpatialPolygonsDataframe有关。您可以编辑您的问题以提供head(NameofYourSpatialDataframe) 的输出吗?
【解决方案3】:

您可以在tidyr 中使用unite()

library(tidyr)

df %>%
  unite(newCity, city:city2, remove = F, na.rm = T)

参数na.rm = T 仅适用于字符列。

【讨论】:

    【解决方案4】:

    另一个base R 选项可能是:

    with(df, pmax(city, city2, na.rm = TRUE))
    
    [1] "sao paulo"      "rio de janeiro" "Belo Horizonte" "Curitiba" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      相关资源
      最近更新 更多