сгруппировать вектор символов в новые группы с помощью dplyr - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть фрейм данных, который выглядит следующим образом:

# A tibble: 5 x 5
# Groups:   Trial [1]
GID       Trial pop   `1A-1145442` `1A-1158042`
<chr>     <chr> <chr>        <int>        <int>
GID421213 ES1   ES1-5           12           11
GID419903 ES1   ES1-5           22           12
GID3881   ES1   ES1-5           22           22
GID13646  ES1   ES1-5           12           12
GID418846 ES1   ES1-5           22           11

Вот его dput:

structure(list(GID = c("GID421213", "GID419903", "GID3881", "GID13646", 
"GID418846"), Trial = c("ES1", "ES1", "ES1", "ES1", "ES1"), pop = c("ES1-5", 
"ES1-5", "ES1-5", "ES1-5", "ES1-5"), `1A-1145442` = c(12L, 22L, 
 22L, 12L, 22L), `1A-1158042` = c(11L, 12L, 22L, 12L, 11L)), row.names = 
 c(NA, -5L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), vars = 
 "Trial", drop = TRUE, indices = list(0:4), group_sizes = 5L, 
 biggest_group_size = 5L, labels = structure(list(Trial = "ES1"), row.names 
 = c(NA, -1L), class = "data.frame", vars = "Trial", drop = TRUE))

Я хочу выполнить преобразование перегруппировки в новыйстолбец из столбца Trial, как я делал это в прошлом для столбца pop, используя операции regex, но теперь с dplyr.Столбец Trial состоит из значений ES от 1 до 38: я бы хотел сгруппировать таким образом ES1-3, ES3-6, ES7-9 и т. Д., Используя пакет dplyr.Я знаю, что могу начать с df >%> group_by(df,Trial), но с этого момента я понятия не имею, как мне действовать.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Вот решение, которое использует parse_number из readr.

df %>% 
  mutate(grp = cut(parse_number(Trial), 
                   breaks = seq(1, 38, by = 3), 
                   right = FALSE)) %>% 
  group_by(grp)

. Это извлекает число из Trial, а затем cut s, чтобы создать переменную группировки, которую затем группирует по,right=FALSE означает, что интервал слева закрыт.


Редактирование на основе комментария ниже.

df %>% 
  mutate(grp = cut(parse_number(Trial), 
                   breaks = c(seq(1, 34, by = 3) 38), 
                   right = FALSE),
                   include.lowest = TRUE) %>% 
  group_by(grp)
0 голосов
/ 18 декабря 2018

Учитывая

(df <- data.frame(Trial = paste0("ES", 1:10)))
#    Trial
# 1    ES1
# 2    ES2
# 3    ES3
# 4    ES4
# 5    ES5
# 6    ES6
# 7    ES7
# 8    ES8
# 9    ES9
# 10  ES10

Мы можем, используя базу R, сделать

size <- 3
groups <- (as.numeric(substring(df$Trial, 3)) - 1) %/% size
(df$newCol <- sprintf("ES%d-%d", 1 + groups * size, size * (1 + groups)))
#  [1] "ES1-3"   "ES1-3"   "ES1-3"   "ES4-6"   "ES4-6"   "ES4-6"   "ES7-9"   "ES7-9"  
#  [9] "ES7-9"   "ES10-12"

Здесь as.numeric(substring(df$Trial, 3)) получает числовую часть df$Trial и преобразует ее в числовой вектор.Вычитая 1 и используя %/%, затем возвращает номер группы для каждого элемента df$Trial, начиная с 0. Учитывая номер группы, мы можем легко построить новый столбец с sprintf.

sizeэто размер групп.Например, установка size <- 5 даст значения ES1-5, ES6-10 и т. Д.

0 голосов
/ 18 декабря 2018
library(dplyr)

df %>% 
  mutate(pop2 = case_when(
    Trial == "ES1" | Trial == "ES2" | Trial == "ES3" ~ "ES1-3",
    Trial == "ES4" | Trial == "ES5" | Trial == "ES6" ~ "ES4-6"
  ))

Вернется

    # A tibble: 5 x 6
# Groups:   Trial [1]
  GID       Trial pop   `1A-1145442` `1A-1158042` pop2 
  <chr>     <chr> <chr>        <int>        <int> <chr>
1 GID421213 ES1   ES1-5           12           11 ES1-3
2 GID419903 ES1   ES1-5           22           12 ES1-3
3 GID3881   ES1   ES1-5           22           22 ES1-3
4 GID13646  ES1   ES1-5           12           12 ES1-3
5 GID418846 ES1   ES1-5           22           11 ES1-3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...