Преобразование данных (один столбец) с помощью строки - PullRequest
1 голос
/ 07 мая 2019

У меня есть таблица с именем DATA_SET. Эта таблица содержит один столбец с шестью различными случаи данных.

    #DATA_SET
    DATA_SET<-data.frame(
           CUSTOMS_RATE=c("20","15+0,41 eur/kg","10+0,1 eur/kg max.17","0,1 
            eur/l max.17","0,04 eur/kg max.10","NA")
                        )

    View(DATA_SET)

    #DATA_SET1
      DATA_SET1<-data.frame(
      RATE="",
      SPECIFIC_RATE="",
      MAXIMUM_RATE=""
                          )

Таким образом, я намерен разделить этот столбец на три различных столбца, чтобы продолжить выполнение других статистических операций (вычисление средних значений и т. Д.), Таких как таблица (DATA_SET 1) ниже.

enter image description here

Так кто-нибудь может мне помочь, как преобразовать эту таблицу?

1 Ответ

3 голосов
/ 07 мая 2019

Обычно, separate будет лучшим вариантом, но в этом случае позиции чисел не одинаковы в каждой строке (иногда также отсутствуют).Итак, мы используем str_extract для индивидуального извлечения значений

library(tidyverse)
DATA_SET %>%
   mutate(CUSTOMS_RATE = str_replace_all(CUSTOMS_RATE, ",", "."),
          RATE = str_extract(CUSTOMS_RATE, "^[0-9]+(?=\\+|$)"), 
          SPECIFIC_RATE = str_extract(CUSTOMS_RATE, "\\d+\\.\\d+"), 
          MAXIMUM_RATE = str_extract(CUSTOMS_RATE, "(?<=max\\.)\\d+")) %>% 
  select(2:4) %>%
  mutate_all(as.numeric)
# RATE SPECIFIC_RATE MAXIMUM_RATE
#1   20          <NA>         <NA>
#2   15          0.41         <NA>
#3   10           0.1           17
#4 <NA>           0.1           17
#5 <NA>          0.04           10
#6 <NA>          <NA>         <NA>

Или используем str_replace для создания одного разделителя, а затем используем separate

DATA_SET %>% 
    mutate(CUSTOMS_RATE = str_replace_all(CUSTOMS_RATE, ",", ".") %>% 
                          str_replace("\\+?([0-9]+\\.[0-9]+)", "+\\1") %>% 
                          str_replace_all("[A-Za-z/ ]+\\.?", "+")) %>% 
    separate(CUSTOMS_RATE, into = c("RATE", "SPECIFIC_RATE", "MAXIMUM_RATE"),
                   sep="\\+", convert = TRUE)
...