【问题标题】:How to extract the high numeric values from data frame in R如何从R中的数据框中提取高数值
【发布时间】:2017-10-22 19:11:05
【问题描述】:

我在这里展示了一个来自模型输出文件的小数据框,我提取了所需的参数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

【问题讨论】:

  • 欢迎来到 SO:请使用 str(data) 确认 data.frame cols 的类型,并使用该信息更新您的答案。
  • > str(data) 'data.frame': 4 obs。 2 个变量:$ 时间:因子 w/4 水平“时间 [T] 3.0000”,..:1 2 3 4 $ watbalr:因子 w/4 水平“WatBalR [%] 0.024”,..:3 1 4 2
  • 请检查更新的问题,我提供了详细信息以便于理解数据。

标签: r regex dataframe extract


【解决方案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

【讨论】:

  • 它提供了准确的值。但它没有绘制图表。当我想绘图时,错误就是这样。 thnx 的时间。 plot(x = times, y = WatBlaR) xy.coords(x, y, xlabel, ylabel, log) 中的错误:找不到对象“WatBlaR”
  • R 找不到变量。那是因为在我的代码中,变量被称为WatBalR 而不是WatBlaR。你必须改变它。
  • 请您看看我的这个问题“在数据框的特定位置导入不同列的表并最终在 R 中创建文本文件”我正在尝试编写模型输入的最后一个文件。然后我将在 R 中编写一个代码,该代码将读取我编写的所有 R 代码并运行模型。谢谢
【解决方案2】:

因此,您正试图从 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

【讨论】:

  • install.packages("strings") 将软件包安装到 'C:/Users/Mohsin/Documents/R/win-library/3.4' (因为 'lib' 未指定) install.packages 中的警告:包“字符串”不可用(对于 R 版本 3.4.0) install.packages 中的警告:无法打开 URL“stats.ox.ac.uk/pub/RWin/bin/windows/contrib/3.4/PACKAGES.rds”:HTTP 状态为“404 未找到”> 库(字符串)库中的错误(字符串) : 没有名为'strings'的包
  • 对不起。库是 stringr
  • 我也试过 stringr。它也是我的代码的一部分。它不工作
猜你喜欢
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多