Соедините два столбца в один в SpatialDataFrame, но пропуская NA в R

Я пытаюсь объединить два столбца SpatialDataFrame (shapefile) в один с помощью программы R, но в обоих столбцах есть пустые места, когда они вместе с именем плюс 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

наблюдения мои исходные данные не такие и имеют больше столбцов

Я использовал это:

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

person Kledson Lemes    schedule 04.03.2020    source источник
comment
Всегда указывайте минимальный воспроизводимый пример: stackoverflow.com/help/minimal-reproducible-example.   -  person Pawel Stradowski    schedule 04.03.2020


Ответы (4)


Вы можете использовать функцию coalesce из пакета dplyr:

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
person dc37    schedule 04.03.2020
comment
вернул следующую ошибку: Ошибка в UseMethod(mutate_): нет применимого метода для 'mutate', примененного к объекту класса c('SpatialPolygonsDataFrame', 'SpatialPolygons', 'Spatial', 'SpatialVector') _, я думаю, это потому, что мои реальные данные - это пространственный кадр данных - person Kledson Lemes; 04.03.2020
comment
Я предполагаю, что это действительно связано с вашим SpatialPolygonsDataframe. Можете ли вы отредактировать свой вопрос, чтобы предоставить вывод head(NameofYourSpatialDataframe) ? - person dc37; 05.03.2020

Другой base R вариант может быть:

with(df, pmax(city, city2, na.rm = TRUE))

[1] "sao paulo"      "rio de janeiro" "Belo Horizonte" "Curitiba" 
person tmfmnk    schedule 04.03.2020

Использование paste склеивает столбцы символов вместе, разделенные пробелом, то есть «_». Попробуй это:

data$newCity <- ifelse(is.na(data$city), data$city2, data$city)
person stefan    schedule 04.03.2020
comment
Привет, спасибо, я пытался использовать этот код, но это не сработало, посмотрите, что мне вернулось: ID city city2 newCity 1 1 saõ paulo ‹NA› 2 2 2 Рио-де-Жанейро ‹NA› 1 3 4 ‹NA› Белу-Оризонти 1 4 5 ‹NA› Куритиба 2 - person Kledson Lemes; 04.03.2020
comment
Похоже, что столбцы символов на самом деле являются факторами. Вы можете проверить это с помощью str(data), который показывает тип ваших переменных. В случае факторов это сработало для меня: df$newCity <- ifelse(is.na(as.character(df$city)), as.character(df$city2), as.character(df$city)). Предпочтительным решением было бы преобразовать факторы в столбцы символов после загрузки данных. - person stefan; 04.03.2020

Вы можете использовать unite() в tidyr:

library(tidyr)

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

Аргумент na.rm = T работает только с символьными столбцами.

person Darren Tsai    schedule 04.03.2020