существует ли код R для разделения координат по широте и долготе с различной длиной?

#r #dplyr #split #tidyr #latitude-longitude

Вопрос:

Я включил этот минимальный пример.

 cluster_id<-c(1,2)
lat_long<-c("35.92,0.34;35.98,-0.13;35.73,-1.29","38.98,-0.34;40.23,1.23")
d<-data.frame(cluster_id,lat_long)
d
 

Я ожидаю следующего результата

 cluster_id<-c(1,1,1,2,2) 
latitude<-c(35.92,35.98,35.73,38.98,40.23) 
longitude<-c(0.34,-0.13,-1.29,-0.34,1.23) 
c<-data.frame(cluster_id,latitude,longitude)
c
 

@ Akindele Дэвис предоставил отличную обратную связь, используя unsplit

Тем не менее, я очень заинтересован в том, чтобы поставить c выше

Комментарии:

1. @Karthik S любезно помогите

2. У вас есть lat,long; или? Почему существует три значения, а затем точка с запятой? т. е. проверьте второй последний

3. @Onyambu Я обновил вопрос

Ответ №1:

Если я правильно понял ваш вопрос, у вас есть одна строка, представляющая собой набор пар широта-долгота. В опубликованном вами примере каждая пара координат разделена точкой с запятой ( » ;»), а внутри каждой пары широта и долгота разделены запятой («,»). Мы можем использовать эту структуру для решения проблемы.

 foo <- "35.9289842120708,-0.37401629584697;35.9295981311974,-0.370106682789026;35.9289842120708,-0.370106682789026"

# Split into a list coordinate pairs
coord_pairs <- strsplit(foo, split = ";")

# Separate the latitude-longitude components
coords <- strsplit(unlist(coord_pairs), split = ",") # We have to unlist coord_pairs because strsplit() expects a character vector

# coords is a list of two-element vectors (lat and long)
# Combine the elements of coords into a matrix, then coerce to a dataframe

df <- as.data.frame(do.call(rbind, coords)) 
 

Комментарии:

1. работает отлично. Однако предположим, что у меня есть несколько строк, и каждая строка имеет свою собственную коллекцию широты и долготы. Как связать разделенные пары, скажем, с уникальным идентификатором и преобразовать в фрейм данных? скажем, cluster_id<-c(1,1,1,1,2,2) ,широта<-c(35.92,35.98,35.73,34.89,32.44.34.99) ,долгота<-c(-0.34,-0.13.-1.23.-0.31,-0.87,-1.03); данные.кадр

2. Итак, если я вас правильно понимаю, вместо одной строки, представляющей собой набор пар широта-долгота, у вас теперь есть вектор таких строк? Тогда пусть bar будет вектор строк, и объедините предыдущие шаги в функцию parse_line(foo) . Затем вы можете сделать do.call(rbind, lapply(seq_along(bar), function(x) cbind(x, parse_line(bar[[x]]))))

3. Я обновил вопрос и ожидаемое решение. пожалуйста, помогите

Ответ №2:

Я уже ответил на ваш обновленный вопрос в комментарии к моему первоначальному ответу, но я могу оценить, что это, возможно, было трудно понять как комментарий.

Во-первых, мы объединим шаги, которые я изложил ранее, в функцию parse_line() .

 parse_line <- function(line){
    coord_pairs <- strsplit(line, split = ";")
    # Separate the latitude-longitude components
    coords <- strsplit(unlist(coord_pairs), split = ",") # We have to unlist coord_pairs because strsplit() expects a character vector
    
    # coords is a list of two-element vectors (lat and long)
    # Combine the elements of coords into a matrix, then coerce to a dataframe
    
    df <- as.data.frame(do.call(rbind, coords)) 
}
 

Затем мы будем использовать parse_line() в качестве строительного блока для аналогичной функции parse_lines() .

 parse_lines <- function(cluster_ids, lines){
  parsed_dfs <- Map(function(x, y) cbind(x, parse_line(y)), cluster_ids, lines) 
# Iterates over all the pairs of cluster_ids and lines
# and adds the cluster_id as a column to the dataframe produced by calling 
# parse_line() on the corresponding line
  combined_df <- do.call(rbind, parsed_dfs) # Combines the list of dataframes into a single dataframe
  colnames(combined_df) <- c("Cluster_ID", "Latitude", "Longitude") # Adds appropriate column names
  return(combined_df)
}

parse_lines(cluster_ids, lat_long)
 

Комментарии:

1. Очень благодарен за этот очень полезный комментарий, окончательное разъяснение, предположим, что мои идентификаторы кластера уникальны и не перечислены последовательно, скажем, cluster_id<-c(448,8231) вместо cluster_id