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



我需要你的帮助!我有以下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

以及…等等最佳

以下是使用gsubstr_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

请注意,精度不会丢失,只是对打印方法的值进行四舍五入。

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

这个REGEX应该能做到:

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

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

最新更新