Разделить символ, указав последнюю запятую в строке символов - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужна твоя помощь!У меня есть следующий df

df <- data.frame("Time,Value"=c(
"32,2,044678E-02",
"32,05,2,044678E-02",
"32,1,2,044678E-02",
"32,15,2,044678E-02"))

проблема в том, что разделитель, здесь запятая ",", смешивается с десятичной позицией, здесь также запятая "," ...

Iхотелось бы иметь следующее:

df <- data.frame(Time=c(
  32,  32.05,  32.1,  32.15),
Value=c(2.044678E-02, 2.044678E-02, 2.044678E-02, 2.044678E-02))

Это только краткий пример, но у меня более 30 тыс. строк этих данных !!!Для тех ваших биологов: это экспорт данных Aglient Bioanalyzer и беспорядок получения данных, смешанных с английским и немецким десятичным индикатором!

Надеюсь, вы мне поможете.Я попробовал несколько вещей, но безуспешно

Я не знаю, но, возможно, решением могло бы быть определение последней запятой и разделение символа в этой точке.Пример:

32,2,044678E-02      to      32           2,044678E-02
and
32,15,2,044678E-02     to     32,15        2,044678E-02

и т. Д. Best

Ответы [ 4 ]

0 голосов
/ 10 декабря 2018

Этот REGEX должен выполнить трюк:

([^",\s].*),(\d+,\d+E-\d+)
  • Group1 - ваш первый номер
  • Group2 - второй / научный номер
0 голосов
/ 10 декабря 2018

Вот способ использования gsub и str_split:

library(stringr)

df <- data.frame("Time,Value"=c(
  "32,2,044678E-02",
  "32,05,2,044678E-02",
  "32,1,2,044678E-02",
  "32,15,2,044678E-02"))


str_split(gsub("(.*[,]?),(.*[,]{1})", "\\1;\\2", df$Time.Value), pattern = ";", simplify = T)


     [,1]    [,2]          
[1,] "32"    "2,044678E-02"
[2,] "32,05" "2,044678E-02"
[3,] "32,1"  "2,044678E-02"
[4,] "32,15" "2,044678E-02"

Теперь вы можете конвертировать в data.frame с желаемыми характеристиками.

0 голосов
/ 10 декабря 2018

Обратите внимание, что точность не теряется, значения просто округляются для метода печати. ​​

library(tidyverse)

df$Time.Value %>% 
  as.character %>% 
  strsplit(',') %>% 
  map_dfr(~ {
    # apply function to .x, separately for (last 2 comma-delimited groups) and (all others)
    tapply(.x, rev(seq_along(.x)) <= 2 
           , function(x) as.numeric(paste0(x, collapse = '.'))
           , simplify = F) %>% 
      setNames(c('Time', 'Value'))
  })

# # A tibble: 4 x 2
#    Time  Value
#   <dbl>  <dbl>
# 1  32   0.0204
# 2  32.0 0.0204
# 3  32.1 0.0204
# 4  32.2 0.0204
0 голосов
/ 10 декабря 2018

Уже есть более аккуратные решения.Я считаю, что это было бы довольно легко изменить из-за прямого использования lapply.

df <- data.frame(
    "Time,Value" = c(
        "32,2,044628E-02",
        "32,05,2,054678E-02",
        "32,1,2,044878E-02",
        "32,15,2,044218E-02"
    )
)

as.data.frame(do.call(rbind, lapply(
    X = strsplit(df$Time.Value, ",", perl = TRUE),
    FUN = function(x) {
        c(paste(x[1:(length(x) - 2)], collapse = ".")
                     ,
                     paste0(x[length(x) - 1], ".", x[length(x)]))
    }
))) -> df_clean


setNames(object = df_clean,
         unlist(strsplit(
             names(df), split = ".", fixed = TRUE
         ))) -> df_clean


head(df_clean)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...