我在这里展示了一个来自模型输出文件的小数据框,我提取了所需的参数time
和WatBlar
并将其转换为数据框。
完整的代码从这里开始。
library(stringr)
x <- readLines("G:/Rlearning/Mohsin-FM/Balance.out")
a <- grep("[T]", x, value = T)
b <- grep("Time", a , value = T)
c <- b[-c(1,2)]
d <- grep("WatBalR", x, value = T)
数据就像那样
data <- data.frame(time =c, watbalr = d)
> data
time watbalr
1 Time [T] 3.0000 WatBalR [%] 0.040
2 Time [T] 6.0000 WatBalR [%] 0.024
3 Time [T] 9.0000 WatBalR [%] 0.044
4 Time [T] 30.0000 WatBalR [%] 0.034
我检查了数据类,它是下面显示的数据框。
> c
[1] " Time [T] 3.0000" " Time [T] 6.0000"
[3] " Time [T] 9.0000" " Time [T] 30.0000"
> class(c)
[1] "character"
> d
[1] " WatBalR [%] 0.040" " WatBalR [%] 0.024"
[3] " WatBalR [%] 0.044" " WatBalR [%] 0.034"
> class(d)
[1] "character"
> class(data)
[1] "data.frame"
提取所需值的代码如下所示。但它只是指定时间0到9的值,任何大于9的值它只是再次从0到9开始。
times <- sub("^.+?(\\d)", "\\1", c)
WatBlaR <- sub("^.+?(\\d)", "\\1", d)
times <- as.numeric(times)
WatBlaR <- as.numeric(WatBlaR)
# plot
plot(x = times, y = WatBlaR)
数据框中如上所述的4个值的结果如下所示。
> times
[1] 3 6 9 0
但是时间所需的结果是
3, 6, 9, 30
当我想从每日基础数据中提取模型数据时,它将值显示为
> times
0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9
它只是按照0到9的所有时间顺序,所需的输出应该是那样的
> times
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
答案 0 :(得分:1)
因此,您尝试从R中的字符向量中提取值。基本字符串函数不像这些情况所需的那样丰富。考虑添加stringr
,这对于这种工作非常方便。
library(stringr)
# I will create a toy df
df <- data.frame(A=c(1,2,16,5), B=c(0.1, 0.4, 0.6, 0.8), C=c('3.0000 WatBalR', '3.0000 WatBalR', '12.0000 WatBalR', '6.0000 WatBalR'),
stringsAsFactors = FALSE)
# now I can extract with a simple regex pattern
times <- as.numeric(str_extract(df$C, '^[0-9]+'))
在这里,我们使用str_extract
提取(data on which to operate, regex pattern)
的签名。我们还使用$
命名data.frame中的列并使其更清晰,以便我们可以传递我们需要的内容。
我也可以轻松获得双打:
watblar <- as.double(str_extract(df$B, '^[.0-9]+'))
且类型正确
> str(times)
num [1:4] 3 3 12 6
> str(watblar)
num [1:4] 0.1 0.4 0.6 0.8
答案 1 :(得分:1)
您可以使用sub
从基础包中提取数字,以查找表单模式
你可以这样做:
library(magrittr) ## For pipe %>%
# Some sample data
data <- data.frame(time = c(" Time [T] 3.0000",
" Time [T] 6.0000",
" Time [T] 9.0000",
" Time [T] 30.0000"),
watbalr = c(" WatBalR [%] 0.040",
" WatBalR [%] 0.024",
" WatBalR [%] 0.044",
" WatBalR [%] 0.034"), stringsAsFactors = FALSE)
## Extract pattern and convert to numeric:
times <- sub("[^[:digit:]]*(\\d+\\.?\\d*).*", "\\1", data$time) %>%
as.numeric
WatBalR <- sub("[^[:digit:]]*(\\d+\\.?\\d*).*", "\\1", data$watbalr) %>%
as.numeric
> times
# [1] 3 6 9 30
> WatBalR
# [1] 0.040 0.024 0.044 0.034