用纵梁转换数据(一列)

时间:2019-05-07 08:48:47

标签: r dataframe stringr

我有一个名为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 个答案:

答案 0 :(得分:3)

通常,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)