Почему stringr :: str_match для столбца возвращает матрицу? - PullRequest
1 голос
/ 21 марта 2020

Я использую 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 - это символьный вектор вместо тиббла?

Ответы [ 2 ]

3 голосов
/ 21 марта 2020

Мы можем использовать 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 
2 голосов
/ 21 марта 2020

Здесь рассмотрим, как избежать этого, а не почему.

Как мы узнали из ?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"]). Подробнее об этом см. в этой главе R для Data Science .

...