Преобразование информации из строк в новые столбцы - PullRequest
1 голос
/ 08 мая 2019

Есть ли способ в R поместить каждые три значения в столбце "V" (ниже) в новые столбцы?Другими словами, мне нужно изменить форму данных с длинного на широкий, но только на три столбца, где значения соответствуют значениям, указанным в столбце V. Ниже приведена демонстрация.

Заранее спасибо!

enter image description here

enter image description here

data = structure(list(Key = c(200, 200, 200, 200, 200, 200, 300, 300, 
                300, 300, 300, 300, 400, 400, 400, 400, 400, 400), 
                V = c("a", "b", "c", "b", "d", "c", "d", "b", "c", "a", "f", "c", "d", "b", 
                "c", "a", "b", "c")), 
                row.names = c(NA, 18L), 
                class = "data.frame")

1 Ответ

1 голос
/ 08 мая 2019

Вот один из вариантов

data %>%
    group_by(Key) %>%
    mutate(
        grp = gl(n() / 3, 3),
        col = c("x", "y", "z")[(row_number() + 2) %% 3 + 1]) %>%
    group_by(Key, grp) %>%
    spread(col, V) %>%
    ungroup() %>%
    select(-grp)
## A tibble: 6 x 4
#    Key x     y     z
#  <dbl> <chr> <chr> <chr>
#1   200 a     b     c
#2   200 b     d     c
#3   300 d     b     c
#4   300 a     f     c
#5   400 d     b     c
#6   400 a     b     c

Примечание. Предполагается, что количество записей на Key делится на 3.

Вместо grp = gl(n() / 3, 3) вы также можете использовать grp = rep(1:(n() / 3), each = 3).


Обновление

В ответ на ваши комментарии создадим пример данных, удалив несколько строк из data, чтобы для Key = 200 и Key = 300 мы не делалине может быть кратно 3 V записей.

data2 <- data %>% slice(-c(1, 8))

Тогда мы можем сделать

data2 %>%
    group_by(Key) %>%
    mutate(grp = gl(ceiling(n() / 3), 3)[1:n()]) %>%
    group_by(Key, grp) %>%
    mutate(col = c("x", "y", "z")[1:n()]) %>%
    spread(col, V) %>%
    ungroup() %>%
    select(-grp)
## A tibble: 6 x 4
#    Key x     y     z
#  <dbl> <chr> <chr> <chr>
#1   200 b     c     b
#2   200 d     c     NA
#3   300 d     c     a
#4   300 f     c     NA
#5   400 d     b     c
#6   400 a     b     c

Обратите внимание, как «пропущенные» значения заполняются NA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...