Как создать новый столбец путем подстановки только текста в строках из существующего столбца в R - PullRequest
2 голосов
/ 15 марта 2020

Я пытаюсь получить новый столбец «Вид» из приведенных ниже примеров данных, который должен содержать только символы из столбца «Образец».

Sample GermD    OD GermDD 
   <chr>  <dbl> <dbl>  <dbl> 
 1 TP_126     2  4.20      2 
 2 TP_126     2  4.35      2 
 3 TP_124     2  3.87      2 
 4 TP_124    NA  4.33     10 
 5 NP_120     2  4.92      2 
 6 NP_120     2  3.78      2 
 7 LO_100     2  4.05      2 

Я пытаюсь следующий код:

df %>%
  dplyr::mutate(Species = strsplit(Sample, split="_"))

Результат желаний должен выглядеть следующим образом.

Sample GermD    OD GermDD Species
   <chr>  <dbl> <dbl>  <dbl> <chr> 
 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 ]

2 голосов
/ 15 марта 2020

Вы также можете сделать:

library(dplyr)

df %>%
  mutate(Species = sub('_.*', '', Sample))

Вывод:

  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
1 голос
/ 15 марта 2020

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...