我一直在try 用包含对str_locatestr_sub的调用的用户定义函数来改变数据集.其目的是定位并提取字符串中3个数字序列中的第一个数字,然后将该数字(作为character)添加到名为数百的新列中.

例如:

  • 给定字符串‘821’:字符串‘8’与Hundreds相加.
  • 给定字符串‘Af823.22’,字符串‘8’与Hundreds相加.

以下是我的功能:

get_hundred <- function(s) {
  match_pos <- str_locate(s, "[0-9]{3}")
  return(str_sub(s, match_pos[1], match_pos[1]))

我的数据的前20行如下所示:

df1 <- structure(list(call.number = c("372.35044 L4383", "344.049 C235", 
"344.410415 DIM", "346.944043 NEI", "808.0667 B2616", "363.6909945 CAST", 
"ABS 2015.0", "371.38 MACK", "372.1102 PRAW", "A823.3 WRIG/T", 
"havmf test", "[DENTISTRY] CROW", "[DENTISTRY] JAWS", "[DENTISTRY] LOWE", 
"[DENTISTRY] MOLA", "[DENTISTRY] SERI", "[DENTISTRY] SKUL", "[DENTISTRY] TEET", 
"[HEALTH]ANKL", "[HEALTH]FOOT"), num.items = c(1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2)), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))

过滤数据

事实上,我只是在call.number的大列表中寻找特定形式的字符串.我相信下面的str_detect是检测到我想要的弦的形式.

df2 <- df1 %>%
  filter(str_detect(call.number, "^[A-Z]?[A-Z|a-z]?[0-9]{3}.*"))

我做错了什么?

现在我这样做:

df2 %>%
  mutate(Hundreds = get_hundred(call.number))

然而,这样做会在第9行的Hundreds列中显示一个‘A’,而我预计在那里会看到一个‘8’.然而,如果我在"A823.3 WRIG/T"("等价字符串")上调用get_hundred,则该函数返回‘8’.

get_hundred("A823.3 WRIG/T")

我有什么不明白的吗?

推荐答案

str_sub应将开始位置和结束位置作为参数!

See ?str_locate: str_locate()返回一个整数矩阵,每个字符串元素有两列和一行.第一列Start给出了比赛开始时的位置,第二列End给出了比赛结束的位置.

See ?str_sub:开始,结束.定义要提取的字符范围的一对整数向量(含).或者,您也可以传递一个矩阵来开始,而不是一对向量.矩阵应该有两列,要么标记为开始和结束,要么标记为开始和长度.

match_pos[, 1]将确保从矩阵中提取开始位置(按str_locate),并按str_sub Select 正确的位置.

library(dplyr)
library(stringr)

get_hundred_tarjae <- function(s) {
  match_pos <- str_locate(s, "[0-9]{3}")
  return(str_sub(s, match_pos[, 1], match_pos[, 1]))
}


df2 <- df1 %>%
  filter(str_detect(call.number, "^[A-Z]?[A-Z|a-z]?[0-9]{3}.*"))

df2 %>%
  mutate(Hundreds = get_hundred_tarjae(call.number))

A tibble: 9 × 3
call.number      num.items Hundreds
<chr>                <dbl> <chr>   
1 372.35044 L4383          1 3       
2 344.049 C235             1 3       
3 344.410415 DIM           1 3       
4 346.944043 NEI           1 3       
5 808.0667 B2616           1 8       
6 363.6909945 CAST         1 3       
7 371.38 MACK              1 3       
8 372.1102 PRAW            1 3       
9 A823.3 WRIG/T            1 8  

R相关问答推荐

棒棒糖图表大小和线宽参数故障标签未出现

使用case_when和Mutate搜索多个列以寻找条件

按块将载体转换为矩阵-reshape

使用tidyverse / Mutate的存款账户余额

如何修复R码的置换部分?

使用tidyverse方法绑定行并从一组管道列表执行左连接

使用R中相同值创建分组观测指标

如何将dygraph调用到R Markdown作为一个shiny 的react 对象的参数?

bslib::card_header中的shine::downloadButton,图标而不是文本

我正在努力用R计算数据集中的中值逐步距离

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

将项粘贴到向量中,并将它们分组为x的倍数,用空格分隔

如何使用同比折线图中的个别日

如何平滑或忽略R中变量的微小变化?

为什么在写入CSV文件时Purrr::Pwalk不起作用

使用gt_summary是否有一种方法来限制每个变量集进行配对比较?

根据r中另一个文本列中给定的范围对各列求和

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内

对一个数据帧中另一个数据帧中的值进行计数

如何准确地指出Read_delim所面临的问题?