Преобразовать символьный вектор высоты в дюймах в см?

Вы также можете использовать HTML5 replaceState, если хотите изменить URL-адрес, но не хотите добавлять запись в историю браузера:

if (window.history.replaceState) {
   //prevents browser from storing history with each change:
   window.history.replaceState(statedata, title, url);
}

Это «сломало» функциональность кнопки «Назад». Это может потребоваться в некоторых случаях, например, в галерее изображений (где вы хотите, чтобы обратная кнопка возвращалась обратно на индексную страницу галереи, вместо того чтобы перемещаться по каждому просматриваемому вами изображению), предоставляя каждому изображению свой собственный уникальный URL.

2
задан Sotos 19 March 2019 в 15:21
поделиться

5 ответов

Есть несколько способов использовать

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"))
0
ответ дан akrun 19 March 2019 в 15:21
поделиться

Использование пакета 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
0
ответ дан Matt Summersgill 19 March 2019 в 15:21
поделиться

Один из вариантов - извлечь все числа и преобразовать их в матрицу, а затем выполнить расчет.

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, а затем для каждого из них преобразовать его в числовой и выполнить расчет.

0
ответ дан Ronak Shah 19 March 2019 в 15:21
поделиться
> 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
0
ответ дан Jilber Urbina 19 March 2019 в 15:21
поделиться

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

Я сначала преобразовываю строку в числовое значение, а затем преобразую единицы:

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.
0
ответ дан JBGruber 19 March 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: