1) Мы можем использовать str_extract
для извлечения букв верхнего регистра ([A-Z]+
) в начале (^
) строки в столбце «Образец»
library(stringr)
library(dplyr)
df %>%
mutate(Species = str_extract(Sample, "^[A-Z]+"))
# Sample GermD OD GermDD Species
#1 TP_126 2 4.20 2 TP
#2 TP_126 2 4.35 2 TP
#3 TP_124 2 3.87 2 TP
#4 TP_124 NA 4.33 10 TP
#5 NP_120 2 4.92 2 NP
#6 NP_120 2 3.78 2 NP
#7 LO_100 2 4.05 2 LO
2) Или с помощью str_remove
удалить подстроку после _
(включая _
)
df %>%
mutate(Species = str_remove(Sample, "_.*"))
3 ) При strsplit
выходное значение составляет list
из vectors
, поэтому нам нужно извлечь первый компонент из list
library(purrr)
df %>%
mutate(Species = strsplit(Sample, split="_") %>%
map_chr(first))
# Sample GermD OD GermDD Species
#1 TP_126 2 4.20 2 TP
#2 TP_126 2 4.35 2 TP
#3 TP_124 2 3.87 2 TP
#4 TP_124 NA 4.33 10 TP
#5 NP_120 2 4.92 2 NP
#6 NP_120 2 3.78 2 NP
#7 LO_100 2 4.05 2 LO
4 ) Или мы можем использовать separate
, а затем удалить второй столбец
library(tidyr)
df %>%
separate(Sample, into = c('Species', "Other"), remove = FALSE) %>%
select(-Other)
5) Или использовать extract
из tidyr
library(tidyr)
df %>%
extract(Sample, into = 'Species', "^([^_]+)_.*", remove = FALSE)
6) В base R
мы можем делать с substr
, и это должно быть очень быстро, если мы знаем положение подстроки для извлечения. Здесь, на основе примера, это первые два символа
df$Species <- substr(df$Species, 1, 2)
7) Или мы можем использовать read.table/read.csv
из base R
и предоставить аргумент sep
как _
df$Species <- read.table(text = df$Sample, sep="_", header = FALSE)$V1
8) или другой вариант с strsplit
из base R
df$Species <- sapply(strsplit(df$Sample, "_"), `[[`, 1)
9) или с trimws
из base R
df$Species <- trimws(df$Sample, whitespace = "_.*")
data
df <- structure(list(Sample = c("TP_126", "TP_126", "TP_124", "TP_124",
"NP_120", "NP_120", "LO_100"), GermD = c(2L, 2L, 2L, NA, 2L,
2L, 2L), OD = c(4.2, 4.35, 3.87, 4.33, 4.92, 3.78, 4.05), GermDD = c(2L,
2L, 2L, 10L, 2L, 2L, 2L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7"))