首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取文本并放入表中

提取文本并放入表中
EN

Stack Overflow用户
提问于 2019-04-19 11:52:00
回答 3查看 54关注 0票数 4

作为来自预测包和rbind()函数的校验残差()函数的结果,我得到了这个矩阵(ETS_RESIDUALS):

代码语言:javascript
复制
#Result of checkresiduals() function

     [,1]                                         
[1,] "Q* = 161.83, df = 18.8, p-value < 2.2e-16"  
[2,] "Q* = 125.46, df = 18.8, p-value < 2.2e-16"  
[3,] "Q* = 263.65, df = 18.8, p-value < 2.2e-16"  
[4,] "Q* = 81.503, df = 18.8, p-value = 8.763e-10"
[5,] "Q* = 36.616, df = 18.8, p-value = 0.008178" 

str(ETS_RESIDUALS)
#chr [1:5, 1] "Q* = 161.83, df = 18.8, p-value < 2.2e-16" "Q* = 125.46, df = 18.8, p-value < 2.2e-16" "Q* = 263.65, df = 18.8, p-value < 2.2e-16" ...

class(ETS_RESIDUALS)
#[1] "matrix"

现在,我打算用grep()或其他函数将这一行文本分割成一个data.frame (包含四列测试、Q*、df、p值),如下例所示:

代码语言:javascript
复制
TEST      Q*        df        p-value
--------------------------------------------
TEST_1  161.83     18.8        2.2e-16  
TEST_2  125.46     18.8        2.2e-16  
TEST_3  263.65     18.8        2.2e-16  
TEST_4  81.503     18.8        8.763e-10
TEST_5  36.616     18.8        0.008178 

我尝试使用这一行代码,但结果并不好。

代码语言:javascript
复制
ETS_RESIDUALS %>%   
  stringr::str_replace_all("(\\S+) =", "`\\1` =") %>%   
  paste0("data.frame(", ., ", check.names = FALSE)")

有人能帮我处理这段代码吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-19 12:33:52

代码语言:javascript
复制
library(dplyr)
library(tidyr)
library(stringr)
#separate based on ,
separate(data.frame(mat), mat ,into = c('Q*','df','p-value'),sep = ',') %>% 
mutate_all(~str_extract(.,'(?<=\\=|\\<\\s).*')) %>% 
#Use positive look-behind to extract everything after = or < followed by a space
mutate(TEST=paste0('TEST_',1:n())) %>% select(TEST,everything())

    TEST      Q*    df    p-value
1 TEST_1  161.83  18.8    2.2e-16
2 TEST_2  125.46  18.8    2.2e-16
3 TEST_3  263.65  18.8    2.2e-16
4 TEST_4  81.503  18.8  8.763e-10
5 TEST_5  36.616  18.8   0.008178

数据

代码语言:javascript
复制
mat <- structure(c("Q* = 161.83, df = 18.8, p-value < 2.2e-16", "Q* = 125.46, df = 18.8, p-value < 2.2e-16", "Q* = 263.65, df = 18.8, 
       p-value < 2.2e-16", "Q* = 81.503, df = 18.8, p-value = 8.763e-10", "Q* = 36.616, df = 18.8, p-value = 0.008178"), 
      .Dim = c(5L, 1L))
票数 3
EN

Stack Overflow用户

发布于 2019-04-19 12:11:52

您可以将strsplit使用到array中,然后将其解析为data.frame对象。

代码语言:javascript
复制
A <- array(apply(M, 1, function(x) unlist(strsplit(strsplit(x, ", ")[[1]], "\\s[<=]\\s"))), 
  c(2, 3, nrow(M)))
d <- setNames(as.data.frame(t(apply(A, 3, function(x) as.numeric(x[2, ])))), A[1,,1])

产生

代码语言:javascript
复制
d
#        Q*   df   p-value
# 1 161.830 18.8 2.200e-16
# 2 125.460 18.8 2.200e-16
# 3 263.650 18.8 2.200e-16
# 4  81.503 18.8 8.763e-10
# 5  36.616 18.8 8.178e-03

数据

代码语言:javascript
复制
M <- structure(c("Q* = 161.83, df = 18.8, p-value < 2.2e-16", "Q* = 125.46, df = 18.8, 
                 p-value < 2.2e-16", 
"Q* = 263.65, df = 18.8, p-value < 2.2e-16", "Q* = 81.503, df = 18.8, p-value = 8.763e-10", 
"Q* = 36.616, df = 18.8, p-value = 0.008178"), .Dim = c(5L, 1L
))
票数 1
EN

Stack Overflow用户

发布于 2019-04-19 12:06:24

一种方法是拆分和使用逻辑子集。

代码语言:javascript
复制
v1 <- unlist(strsplit(m1, ' = | < | > |, '))
setNames(as.data.frame(matrix(v1[c(FALSE, TRUE)], nrow = nrow(m1), byrow = TRUE)), 
                                                                   unique(v1[c(TRUE, FALSE)]))
#      Q*   df p-value
#1 161.83 18.8 2.2e-16
#2 161.83 18.8 2.2e-16
#3 161.83 18.8 2.2e-16
#4 161.83 18.8 2.2e-16
#5 161.83 18.8 2.2e-16

要创建额外的列,只需

代码语言:javascript
复制
df$TEST <- paste0('TEST', seq(nrow(df)))

注意:由于示例矩阵的所有字符串都相同,所以所有的值都是相同的,

代码语言:javascript
复制
[,1]                                       
[1,] "Q* = 161.83, df = 18.8, p-value < 2.2e-16"
[2,] "Q* = 161.83, df = 18.8, p-value < 2.2e-16"
[3,] "Q* = 161.83, df = 18.8, p-value < 2.2e-16"
[4,] "Q* = 161.83, df = 18.8, p-value < 2.2e-16"
[5,] "Q* = 161.83, df = 18.8, p-value < 2.2e-16"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55761411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档