Перенос тибля с датами в виде заголовков и несколькими наблюдениями за датой - PullRequest
1 голос
/ 01 октября 2019

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

   X  Form  Jan_92 Feb_92 Mar_92 (....)
<int> <fct>  <dbl> <dbl>  <dbl>
   1  var1   2.02   2.97  0.12 
   2  var2   0.23   0.28  0.33
   3  var3   0.08   0.28  0.12

Я хочу привести его в порядок, чтобы все комбинации месяца / года (всего 10 лет) были в одном столбце, иМеры var1 / var2 / var3 - это имена столбцов с соответствующими значениями (соответствующими датам).

До сих пор я пытался транспонировать с t (данные), но это превращает его в фрейм данных, и я получаю странную строку/ Проблемы с именами столбцов, которые я не могу исправить, когда я возвращаю их в формат таблицы. Помогите!

Ответы [ 3 ]

2 голосов
/ 01 октября 2019

Если вам не важен столбец X (а это просто счетчик), то в data.table работает:

library(data.table)

dcast(melt(setDT(df1), id=c("X","Form"), variable.name = "datetime"), datetime ~ Form)

#>    datetime var1 var2 var3
#> 1:   Jan_92 2.02 0.23 0.08
#> 2:   Feb_92 2.97 0.28 0.28
#> 3:   Mar_92 0.12 0.33 0.12

или другое решение tidyverse:

library(dplyr)
library(tidyr)

df1 %>%
  select(-X) %>% 
  gather(datetime, value, -Form) %>%
  spread(Form, value)

# >   datetime var1 var2 var3 
# > 1   Feb_92 2.97 0.28 0.28   
# > 2   Jan_92 2.02 0.23 0.08 
# > 3   Mar_92 0.12 0.33 0.12

Использование данных Акруна .

2 голосов
/ 01 октября 2019

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

as_tibble(cbind(Dates = names(df), t(df))) %>% .[-c(1:2),]

# A tibble: 3 x 4
#  Dates  V2    V3    V4   
#  <chr>  <chr> <chr> <chr>
#1 Jan_92 2.02  0.23  0.08 
#2 Feb_92 2.97  0.28  0.28 
#3 Mar_92 0.12  0.33  0.12 

Данные

df <- as_tibble(read.table(header = TRUE, text = "X Form Jan_92 Feb_92 Mar_92
1 var1 2.02 2.97 0.12
2 var2 0.23 0.28 0.33
3 var3 0.08 0.28 0.12"))
1 голос
/ 01 октября 2019

Мы можем преобразовать в «длинный» формат с помощью pivot_longer, а затем изменить его на «широкий» с помощью pivot_wider

library(dplyr)
library(tidyr)
df1 %>% 
   pivot_longer(cols = -c(X, Form)) %>% 
   select(-X) %>%
   group_by(Form) %>%
   mutate(rn = row_number()) %>%       
   pivot_wider(names_from = Form, values_from = value)
# A tibble: 3 x 5
#      rn name    var1  var2  var3
#  <int> <chr>  <dbl> <dbl> <dbl>
#1     1 Jan_92  2.02  0.23  0.08
#2     2 Feb_92  2.97  0.28  0.28
#3     3 Mar_92  0.12  0.33  0.12

data

df1 <- structure(list(X = 1:3, Form = c("var1", "var2", "var3"), Jan_92 = c(2.02, 
0.23, 0.08), Feb_92 = c(2.97, 0.28, 0.28), Mar_92 = c(0.12, 0.33, 
0.12)), class = "data.frame", row.names = c(NA, -3L))
...