как сделать несколько gsubs и мутировать - PullRequest
0 голосов
/ 03 марта 2019

У меня есть огромный фрейм данных, подобный этому

      scan_id sample
1  s10w_00001      1
2  s10w_00002      2
3  s10w_00003      3
4  s10w_00004      4
5  s11d_00001      5
6  s11d_00002      6
7  s11d_00003      7
8  s11d_00004      8
9  s11w_00001      9
10 s11w_00002     10
11 s11w_00003     11

Я хочу добавить еще один столбец с именем size.Однако этот столбец должен соответствовать столбцу scan_id, где все scan_id с 00001 в конце должны быть большими, 00002 = средними, 00003 = маленькими 00004 = очень маленькими.

кадр данных должен выглядеть примерно так

      scan_id sample sixe
1  s10w_00001      1  big
2  s10w_00002      2 medium
3  s10w_00003      3 small
4  s10w_00004      4 extra small
5  s11d_00001      5 big
6  s11d_00002      6 medium
7  s11d_00003      7 small
8  s11d_00004      8 extra small
9  s11w_00001      9 big 
10 s11w_00002     10 medium 
11 s11w_00003     11 small

как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Работает ли это для вас:

library(tidyverse)

df %>%
  separate(col = scan_id, into = c("scan", "id"), sep = "_") %>%
  mutate(size = case_when(id == "00001" ~ "big",
                          id == "00002" ~ "medium",
                          TRUE          ~ "small")) %>%
  unite(col = "scan_id", c("scan", "id"), sep = "_")
0 голосов
/ 03 марта 2019

Вот решение.Обратите внимание, что когда параметр scan_id не является ни 00001, ни 00002, размер будет «маленьким»:

library(dplyr)
df_clean <- df %>% 
  mutate(size = ifelse(grepl("00001", scan_id), "big", "small")) %>% 
  mutate(size = ifelse(grepl("00002", scan_id), "medium", size)) %>%   

mutate(size = ifelse(grepl("00003", scan_id), "small", size))
> df_clean
      scan_id sample        size
1  s10w_00001      1         big
2  s10w_00002      2      medium
3  s10w_00003      3       small
4  s10w_00004      4 extra small
5  s11d_00001      5         big
6  s11d_00002      6      medium
7  s11d_00003      7       small
8  s11d_00004      8 extra small
9  s11w_00001      9         big
10 s11w_00002     10      medium
11 s11w_00003     11       small

Данные

Обычно вы должны предоставлять данные с dput, который преобразует ваш data.frame в текстэто легко прочитать. Вот данные, которые я использовал:

df <- read.table(text =
  "scan_id sample
  1  s10w_00001      1
  2  s10w_00002      2
  3  s10w_00003      3
  4  s10w_00004      4
  5  s11d_00001      5
  6  s11d_00002      6
  7  s11d_00003      7
  8  s11d_00004      8
  9  s11w_00001      9
  10 s11w_00002     10
  11 s11w_00003     11", header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...