如何从R中的数据帧中提取高数值

时间:2017-05-23 01:47:22

标签: r regex dataframe extract

我在这里展示了一个来自模型输出文件的小数据框,我提取了所需的参数timeWatBlar并将其转换为数据框。 完整的代码从这里开始。

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

2 个答案:

答案 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