A dplyr
/ tidyverse
решение: Подобно ответам akrun и 42-, я использую gsub()
, чтобы избавиться от скобок, их содержимого и пробелов. Далее я tidyr::separate()
значения в столбце col1 в два столбца. dplyr::rowise()
и dplyr::mutate()
затем используются для вычисления медианы на строку и деления на 1000.
library(dplyr)
library(tidyr)
df1 %>%
mutate(col1 = gsub("\\[(.*?)\\]|\\s+", "", col1)) %>%
separate(col1, into = c("col1", "col2"), sep = "–", fill = "right") %>%
mutate_at(vars(col1, col2), as.numeric) %>%
rowwise() %>%
mutate(result = median(c(col1, col2) / 1000, na.rm = TRUE))
#> Source: local data frame [9 x 3]
#> Groups: <by row>
#>
#> # A tibble: 9 x 3
#> col1 col2 result
#> <dbl> <dbl> <dbl>
#> 1 1800 NA 1.8
#> 2 3300 12000 7.65
#> 3 5000 6000 5.5
#> 4 5930 6970 6.45
#> 5 75000 80000 77.5
#> 6 93000 NA 93
#> 7 195000 210000 202.
#> 8 530000 NA 530
#> 9 595000 NA 595
В качестве альтернативы все можно сделать с помощью одного mutate()
.
library(purrr)
df1 %>%
rowwise() %>%
mutate(col1 = gsub("\\[(.*?)\\]|\\s+", "", col1) %>%
strsplit("–") %>%
map_dbl(function(x) as.numeric(x) %>%
median())/1000)
#> Source: local data frame [9 x 1]
#> Groups: <by row>
#>
#> # A tibble: 9 x 1
#> col1
#> <dbl>
#> 1 1.8
#> 2 7.65
#> 3 5.5
#> 4 6.45
#> 5 77.5
#> 6 93
#> 7 202.
#> 8 530
#> 9 595
Я чувствую, что мой первый пример более явный, в то время как этот немного более затруднен, и я обычно стараюсь избегать каналов внутри mutate()
.