r-将字符串str_detect管道连接到str_extract的问题-extract仅从第一行提取文本:参数不是原子向



我正在尝试创建一个新列,它只包含表达式中的某些数字数据。

以下是我的数据:https://pastebin.com/hYg3zqYz

我只需要第12列双极之后的数字。

以下是的工作原理

p <- df %>% 
select(where(~ any(stringr::str_detect(.x, "Bipolar")))) #returns correct column

当我尝试创建一个只拉文本的新列时,它只返回第一行,不确定我做错了什么。

p %>%
mutate(group = "sr_bipol",
sr_bipol = as.numeric(stringr::str_extract(., "[0-9].[0-9]+"))) %>% 
select(group, sr_bipol)
# A tibble: 20 × 2
group    sr_bipol
<chr>       <dbl>
1 sr_bipol     7.83
2 sr_bipol     7.83
3 sr_bipol     7.83
4 sr_bipol     7.83
5 sr_bipol     7.83
.....................

我还得到错误代码:

argument is not an atomic vector; coercing 

在一个新的案例中加载后,我尝试使用以下解决方案,但遇到了一个新错误

新数据:https://paste.kodi.tv/azuramoguh

df %>% 
transmute(across(where(~ any(stringr::str_detect(.x, "Bipolar"))), 
~ as.numeric(str_extract(.x, "(?<=Bipolar\s)[0-9]\.[0-9]+")), 
.names = "sr_bipol{str_remove(.col, '[.]+')}"))
Error in `$<-.data.frame`(`*tmp*`, "call_text", value = c("df %>% ...",  : 
replacement has 13 rows, data has 12

也尝试过:

df %>% 
select(where(~ any(stringr::str_detect(.x, "Bipolar")))) %>% #this finds the column with the bipolar ##voltage data
transmute(group = "sr_bipol",
sr_bipol = as.numeric(
stringr::str_extract(pull(.,1), "[0-9].[0-9]+") #str_extract expects a vector, so "pull" to #change from df to vector
)
) %>%
bind_cols(carto_lv_sr_volt %>% select(x:z))
Error in `select()`:
! `where()` must be used with functions that return `TRUE` or `FALSE`.

.指的是整个数据集(str_extract需要一个矢量作为输入,而不是数据帧(。根据?str_extract

字符串-输入向量。要么是一个字符向量,要么是对一个可强制的东西。

我们可能需要在第12列上应用str_extract。由于12前缀的列名包括...,这是不寻常的列名,因此使用backticks访问列值

library(dplyr)
library(stringr)
df %>% 
transmute(group = 'sr_bipol', 
sr_bipol = as.numeric(str_extract(`...12`, "(?<=Bipolar\s)[0-9]\.[0-9]+")))

-输出

# A tibble: 20 × 2
group    sr_bipol
<chr>       <dbl>
1 sr_bipol     7.83
2 sr_bipol     2.34
3 sr_bipol     1.97
4 sr_bipol     1.94
5 sr_bipol     2.85
6 sr_bipol     2.92
7 sr_bipol     3.05
8 sr_bipol     2.80
9 sr_bipol     3.43
10 sr_bipol     2.11
11 sr_bipol     2.80
12 sr_bipol     1.81
13 sr_bipol     1.84
14 sr_bipol     3.87
15 sr_bipol     1.68
16 sr_bipol     2.21
17 sr_bipol     2.97
18 sr_bipol     3.09
19 sr_bipol     2.84
20 sr_bipol     3.48

p数据是单列tibble/data.frame。当我们使用.时,它会选择数据帧,即

> str(p)
tibble [20 × 1] (S3: tbl_df/tbl/data.frame)
$ ...12: chr [1:20] "Bipolar 7.827 / Unipolar 16.911 / LAT -9.0" "Bipolar 2.34 / Unipolar 9.09 / LAT -10.0" "Bipolar 1.974 / Unipolar 9.219 / LAT -11.0" "Bipolar 1.938 / Unipolar 10.572 / LAT -9.0" ...
> str_extract(p, "[0-9].[0-9]+")
[1] "7.827"
Warning message:
In stri_extract_first_regex(string, pattern, opts_regex = opts(pattern)) :
argument is not an atomic vector; coercing

它从第一个实例中提取值,并将其回收以创建7.8 的整个列


如果有多个列具有"双极",我们可以循环across(如果我们想保留原始数据中的所有其他列,则将transmute修改为mutate(

df %>% 
transmute(across(where(~ any(stringr::str_detect(.x, "Bipolar"), na.rm = TRUE)), 
~ as.numeric(str_extract(.x, "(?<=Bipolar\s)[0-9]\.[0-9]+")), 
.names = "sr_bipol{str_remove(.col, '[.]+')}"))
# A tibble: 20 × 1
sr_bipol12
<dbl>
1       7.83
2       2.34
3       1.97
4       1.94
5       2.85
6       2.92
7       3.05
8       2.80
9       3.43
10       2.11
11       2.80
12       1.81
13       1.84
14       3.87
15       1.68
16       2.21
17       2.97
18       3.09
19       2.84
20       3.48

这里有一种替代方法:

library(tidyverse)
df %>% 
select(...12) %>% 
separate(...12, into="group", sep = "\/") %>%
mutate(sr_bipol = parse_number(group),
group= str_extract(group, '[A-Za-z]+'))
group   sr_bipol
<chr>      <dbl>
1 Bipolar     7.83
2 Bipolar     2.34
3 Bipolar     1.97
4 Bipolar     1.94
5 Bipolar     2.85
6 Bipolar     2.92
7 Bipolar     3.05
8 Bipolar     2.80
9 Bipolar     3.43
10 Bipolar     2.11
11 Bipolar     2.80
12 Bipolar     1.81
13 Bipolar     1.84
14 Bipolar     3.87
15 Bipolar     1.68
16 Bipolar     2.21
17 Bipolar     2.97
18 Bipolar     3.09
19 Bipolar     2.84
20 Bipolar     3.48

最新更新