преобразовать набор данных в аккуратный формат, объединяя столбец и строку в R - PullRequest
1 голос
/ 30 января 2020

У меня есть набор данных, который находится в несколько неудачной структуре:

Species    site  2001  2002  2003 
a          1      0     1    4
a          2      1     1    0
a          3      5     5    5
b          1      3     0    4
b          2      1     1    1
b          3      4     5    5

После нескольких часов попыток получить его в правильном формате с помощью R, я сделал это в Excel и преобразовал его в формат ниже ,

ID       a   b
1_2001   0   3
1_2002   1   0
1_2003   4   4
2_2001   1   1
2_2002   1   1
2_2003   0   1
3_2001   5   4
3_2002   5   5
3_2004   5   5

Исходный набор данных довольно большой, и я не могу дать ему отдохнуть, потому что я не знаю, как сделать это быстро в R. Может кто-нибудь объяснить мне, как это преобразование может быть сделано в R

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Используя tidyr и dplyr, вы можете сначала преобразовать столбцы нашего года в более длинный формат, затем использовать pivot_wider, чтобы создать столбцы "a" и "b", собрать "site" и "ID" и, наконец, оставьте только нужные столбцы:

library(tidyr)
library(dplyr)
df %>% pivot_longer(.,-c(Species, site), names_to = "ID", values_to = "val") %>%
  pivot_wider(.,names_from = Species, values_from = val) %>%
  rowwise() %>%
  mutate(ID = paste(site,ID, sep = "_")) %>%
  select(ID, a, b)

Source: local data frame [9 x 3]
Groups: <by row>

# A tibble: 9 x 3
  ID         a     b
  <chr>  <int> <int>
1 1_2001     0     3
2 1_2002     1     0
3 1_2003     4     4
4 2_2001     1     1
5 2_2002     1     1
6 2_2003     0     1
7 3_2001     5     4
8 3_2002     5     5
9 3_2003     5     5

Данные

structure(list(Species = c("a", "a", "a", "b", "b", "b"), site = c(1L, 
2L, 3L, 1L, 2L, 3L), `2001` = c(0L, 1L, 5L, 3L, 1L, 4L), `2002` = c(1L, 
1L, 5L, 0L, 1L, 5L), `2003` = c(4L, 0L, 5L, 4L, 1L, 5L)), row.names = c(NA, 
-6L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x56276b4f1350>)
1 голос
/ 30 января 2020

Здесь другое решение с gather и spread из tidyr-package:

tibble::tibble(Species = c("a", "a", "a", "b", "b", "b"), 
               site = c(1L, 2L, 3L, 1L, 2L, 3L), 
               `2001` = c(0L, 1L, 5L, 3L, 1L, 4L), 
               `2002` = c(1L, 1L, 5L, 0L, 1L, 5L), 
               `2003` = c(4L, 0L, 5L, 4L, 1L, 5L)) %>% 
  tidyr::gather(-Species, -site, key = "key", value = "value") %>% 
  tidyr::spread(key = "Species", value = "value")

Выход:

# A tibble: 9 x 4
   site key       a     b
  <int> <chr> <int> <int>
1     1 2001      0     3
2     1 2002      1     0
3     1 2003      4     4
4     2 2001      1     1
5     2 2002      1     1
6     2 2003      0     1
7     3 2001      5     4
8     3 2002      5     5
9     3 2003      5     5
...