Вы также можете использовать HTML5 replaceState, если хотите изменить URL-адрес, но не хотите добавлять запись в историю браузера:
if (window.history.replaceState) {
//prevents browser from storing history with each change:
window.history.replaceState(statedata, title, url);
}
Это «сломало» функциональность кнопки «Назад». Это может потребоваться в некоторых случаях, например, в галерее изображений (где вы хотите, чтобы обратная кнопка возвращалась обратно на индексную страницу галереи, вместо того чтобы перемещаться по каждому просматриваемому вами изображению), предоставляя каждому изображению свой собственный уникальный URL.
Есть несколько способов использовать
1) Читать с fread
после вставки в одну строку
library(data.table)
fread(paste(sub('"', "", df1$H), collapse="\n"), sep="'")[,
as.matrix(.SD) %*% c(30.48, 2.54)][,1]
#[1] 187.96 177.80 165.10 154.94 165.10 162.56
2) [ 1114] Использование gsubfn
library(gsubfn)
as.numeric(gsubfn("(\\d)'(\\d+)", ~ as.numeric(x) * 30.48 +
as.numeric(y) * 2.54, sub('"', '', df1$H)))
#[1] 187.96 177.80 165.10 154.94 165.10 162.56
3) с separate
library(tidyverse)
df1 %>%
separate(H, into = c("H1", "H2"), convert = TRUE) %>%
transmute(H = H1 * 30.48 + H2 * 2.54)
# A tibble: 6 x 1
# H
# <dbl>
#1 188.
#2 178.
#3 165.
#4 155.
#5 165.
#6 163.
4) с measurements
[1112 ]
library(measurements)
library(tidyverse)
df1 %>%
separate(H, into = c("H1", "H2"), convert = TRUE) %>%
transmute(H = conv_unit(H1, "ft", "cm") + conv_unit(H2, "inch", "cm"))
Использование пакета stringi
для извлечения соответствующих единиц:
library(stringi)
Raw <- c("6'2\"", "5'10\"", "5'5\"", "5'1\"", "5'5\"", "5'4\"")
## Extract Feet units by regex searching for 1 or more digits followed by a '
Feet <- stri_extract_first_regex(Raw, "[[:digit:]]+(?=')"))
## Extract Inch units by regex searching for 1 or 2 digits followed by a "
Inches <- stri_extract_first_regex(Raw, "[[:digit:]]{1,2}(?=\")"))
## Combine Feet and Inches
TotalInches <- 12 * as.numeric(Feet) + as.numeric(Inches)
## Convert to cm
CM <- 2.54 * TotalInches
print(CM)
# [1] 187.96 177.80 165.10 154.94 165.10 162.56
Если вам нужно сделать это для нескольких столбцов, возможно, имеет смысл определить шаги как функцию в верхней части вашего столбца. сценарий, чтобы вы могли назвать его более кратко и не нужно хранить промежуточные результаты в глобальной среде.
Еще одно соображение, принятое здесь в версии функции, заключается в замене NA
совпадений на значения 0
, чтобы действительные измерения, такие как 1'
или 11"
, возвращали действительные результаты вместо NA
.
FtInToCm <- function(x){
Feet <- as.numeric(stringi::stri_extract_first_regex(Raw, "[[:digit:]]+(?=')"))
Inches <- as.numeric(stringi::stri_extract_first_regex(Raw, "[[:digit:]]{1,2}(?=\")"))
return(2.54 * (12 * ifelse(is.na(Feet),0,Feet) + ifelse(is.na(Inches),0,Inches)))
}
FtInToCm(Raw)
#[1] 187.96 177.80 165.10 154.94 165.10 162.56
Один из вариантов - извлечь все числа и преобразовать их в матрицу, а затем выполнить расчет.
mat <- stringr::str_extract_all(df$H, "\\d+", simplify = TRUE)
as.numeric(mat[, 1]) * 30.48 + as.numeric(mat[, 2]) * 2.54
#[1] 187.96 177.80 165.10 154.94 165.10 162.56
где mat
-
# [,1] [,2]
#[1,] "6" "2"
#[2,] "5" "10"
#[3,] "5" "5"
#[4,] "5" "1"
#[5,] "5" "5"
#[6,] "5" "4"
Первый столбец - это футы, а второй - дюймы.
И просто для собственного любопытства я хотел решить эту проблему в базе R
sapply(strsplit(sub("(\\d+)'(\\d+).*", "\\1-\\2", df$H), "-"), function(x)
as.numeric(x[1]) * 30.48 + as.numeric(x[2]) * 2.54)
#[1] 187.96 177.80 165.10 154.94 165.10 162.56
Это следует аналогичной логике, которая извлекает 2 числа из строки, используя sub
, разделяя их используя strsplit
, а затем для каждого из них преобразовать его в числовой и выполнить расчет.
> dat <- tibble(H = c("6'2\"", "5'10\"", "5'5\"", "5'1\"", "5'5\"", "5'4\""))
> dat$inches <- gsub("[\"]", "",dat$H) %>%
strsplit(., "'") %>%
lapply(., function(x) {
x <- as.numeric(x);
(x[1]*30.48) + (x[2]/12)*30.48
}) %>%
unlist
> dat
# A tibble: 6 x 2
H inches
<chr> <dbl>
1 "6'2\"" 188.
2 "5'10\"" 178.
3 "5'5\"" 165.
4 "5'1\"" 155.
5 "5'5\"" 165.
6 "5'4\"" 163.
Вы даже можете использовать map
вместо lapply
> gsub("[\"]", "",dat$H) %>%
strsplit(., "'") %>%
map_dbl(function(x){
x <- as.numeric(x)
(x[1]*30.48) + (x[2]/12)*30.48
})
[1] 187.96 177.80 165.10 154.94 165.10 162.56
Я добавляю другой ответ, просто чтобы дать вам другой вариант, и потому что я уже написал его, прежде чем я увидел другие ответы.
Я сначала преобразовываю строку в числовое значение, а затем преобразую единицы:
library(dplyr)
library(stringr)
df <- tibble(H = c("6'2\"", "5'10\"", "5'5\"", "5'1\"", "5'5\"", "5'4\""))
df %>%
mutate(foot = str_extract(H, "^\\d+'"),
inch = str_extract(H, "\\d+\"$")) %>% # split foot from inch
mutate(foot = as.numeric(str_remove(foot, "[^\\d]")),
inch = as.numeric(str_remove(inch, "[^\\d]"))) %>% # convert to numeric
mutate(H_new = cm(foot * 12) + cm(inch)) # convert units
# A tibble: 6 x 4
H foot inch H_new
<chr> <dbl> <dbl> <dbl>
1 "6'2\"" 6 2 188.
2 "5'10\"" 5 10 178.
3 "5'5\"" 5 5 165.
4 "5'1\"" 5 1 155.
5 "5'5\"" 5 5 165.
6 "5'4\"" 5 4 163.