为什么列上的stringr :: str_match返回小标题?

问题描述 投票:0回答:2

我正在使用tidyverse加载数据,所以我有一个小标题,您可以像这样重现:

df_1 <- tibble(id = c(1, 2, 3), subject_id = c("ABCD-FOO1-G001-YX-732E5", "ABCD-FOO2-A011-ZA-892N2", "ABCD-FOO3-1001-CD-742W5"))

现在,我想修改subject_id以仅提取前两个字符组,即:

"ABCD-FOO1-G001-YX-732E5" -> "ABCD-FOO1"

当我运行以下代码时:

df_1 %>% mutate(subject_id = stringr::str_match(subject_id, "[^-]*-[^-]*"))

subject_id列的每个元素本身都是小标题:

> class(df_1[1, "subject_id"])
[1] "tbl_df"     "tbl"        "data.frame"

如何确定subject_id是字符向量而不是小标题?

r stringr tibble
2个回答
1
投票

我们可以使用str_extract

library(stringr)
library(dplyr)
df_1 %>%
     mutate(subject_id = str_extract(subject_id, "^\\w+-\\w+"))
# A tibble: 3 x 2
#     id subject_id
#  <dbl> <chr>     
#1     1 ABCD-FOO1 
#2     2 ABCD-FOO2 
#3     3 ABCD-FOO3 

1
投票

这里介绍如何避免这种情况,而不是为什么。

我们从?str_match中学习:

对于str_match,是一个字符矩阵。第一列是完全匹配项,然后是每个捕获组的一列。 [...]

因此,我们需要从矩阵中提取第一列:

df_1 %>% mutate(subject_id = stringr::str_match(subject_id, "[^-]*-[^-]*") %>% .[,1])
# # A tibble: 3 x 2
#      id subject_id
#   <dbl> <chr>     
# 1     1 ABCD-FOO1 
# 2     2 ABCD-FOO2 
# 3     3 ABCD-FOO3 

还请记住,在您的class()示例中,您对小标题进行了子集化。即使只有1个像元,小标题也将始终保持小标题。参见比较class(df_2[1,"id"])。有关更多信息,请查看this chapter from R for Data Science

© www.soinside.com 2019 - 2024. All rights reserved.