我需要你的帮助!我有以下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
以及…等等最佳
以下是使用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
。
请注意,精度不会丢失,只是对打印方法的值进行四舍五入。
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)