Извлечение чисел из столбца и создание новой строки - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть набор данных, который включает в себя несколько точек широты и долготы в одном и том же столбце, а также столбцы с дополнительными переменными, например:

Какие данные в настоящее время выглядят

What data currently looks like

Что я хотел бы сделать, это извлечь числа, кратные 2 (i.e. 144.81803494458699788 and -37.80978699721590175 then 144.8183146450259926 -37.80819285880839686), в их собственные строки.Новые строки также будут дублировать остальную часть исходной строки, из которой они получены, т.е.

Как бы я хотел, чтобы данные выглядели как

What I would like the data to look like

Ядовольно плохо знаком с R, следовательно, возможно, что может показаться базовым вопросом для всех вас.Обновление: я теперь использовал

new$latlongs <- str_extract_all(roadchar$X.wkt_geom, "(?>-)*[0-9]+\\.[0-9]+") 

и извлек цифры / латлонги, включая отрицательный знак:)

1 Ответ

0 голосов
/ 26 ноября 2018

Вы можете использовать цикл, который объединяет gsub и strsplit:

## The data.frame
df <- data.frame ("Polyline" = c("MultiLineString((1.1 - 1.1, 2.2 - 2.2))",
                                 "MultiLineString((3.3 - 3.3, 4.4 - 4.4, 5.5 - 5.5))"),
                  t(matrix(c(LETTERS[c(1:3,24:26)]), 3,
                    dimnames = list(c("Char1", "Char2", "Char3")))),
                  stringsAsFactors = FALSE)


#                                             Polyline Char1 Char2 Char3
# 1            MultiLineString((1.1 - 1.1, 2.2 - 2.2))     A     B     C
# 2 MultiLineString((3.3 - 3.3, 4.4 - 4.4, 5.5 - 6.6))     X     Y     Z

## Function for splitting the line
split.polyline <- function(line, df) {
    ## Removing the text and brackets
    cleaned_line <- gsub("\\)\\)", "", gsub("MultiLineString\\(\\(", "", as.character(df$Polyline[line])))
    ## Splitting the line
    split_line <- strsplit(cleaned_line, split = ", ")[[1]]
    ## Making the line into a data.frame
    df_out <- data.frame("Polyline" = split_line,
                         matrix(rep(df[line, -1], length(split_line)),
                                nrow = length(split_line), byrow = TRUE,
                                dimnames = list(c(), names(df)[-1]))
                        )
    return(df_out)
}


## You can use the function like this for the first row for example
df_out <- split.polyline(1, df)
#    Polyline Char1 Char2 Char3
# 1 1.1 - 1.1     A     B     C
# 2 2.2 - 2.2     A     B     C

## Or loop through all the rows
for(line in 2:nrow(df)){
    df_out <- rbind(df_out, split.polyline(line, df))
}
#    Polyline Char1 Char2 Char3
# 1 1.1 - 1.1     A     B     C
# 2 2.2 - 2.2     A     B     C
# 3 3.3 - 3.3     X     Y     Z
# 4 4.4 - 4.4     X     Y     Z
# 5 5.5 - 5.5     X     Y     Z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...