通过识别字符串中出现的最后一个逗号来分割字符

时间:2018-12-10 13:00:12

标签: r regex

我需要您的帮助!我有关注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"))

问题在于,分隔符(这里的逗号“,”)与小数点位置混合在一起,这里也是逗号“,” ...

我想要以下内容:

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))

这只是一个简短的例子,但是我有超过3万行的数据!!!对于您的生物学家来说:这是Aglient Bioanalyzer数据的导出,并且是混乱的获取数据,与英语和德语十进制指示符混合在一起!

希望您能帮助我。我尝试了几件事,但没有成功

我不知道,但是也许一个解决方案可能是识别最后一个逗号并在此点分割字符。 示例:

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

和 ....等等 最好

4 个答案:

答案 0 :(得分:3)

这是使用predict()UPDATE t2 SET t2.WEIGHT = t1.AVG_WEIGHT FROM TABLE2 t2 INNER JOIN (select TABLE1.DESCRIPTION,AVG(TABLE1.WEIGHT) as AVG_WEIGHT from TABLE1 group by TABLE1.DESCRIPTION) as t1 on TABLE2.DESCRIPTION = TABLE1.DESCRIPTION 的一种方式:

gsub

现在,您可以转换为具有所需规格的str_split

答案 1 :(得分:2)

请注意,精度不会丢失,只是为打印方法舍入了值。

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

答案 2 :(得分:0)

已经有更整洁的解决方案。我认为由于直接使用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)

答案 3 :(得分:0)

此REGEX应该可以解决问题:

([^",\s].*),(\d+,\d+E-\d+)
  • Group1是您的第一个电话号码
  • Group2是第二个/科学数字