В R есть ли способ изменить структуру данных так, чтобы идентификаторами были заголовки столбцов?

#r

#r

Вопрос:

В настоящее время мой набор данных выглядит следующим образом.

      1/1/2020 1/2/2020 1/3/2020 ...
A     Value    Value    Value
B     Value    Value    Value     
C     Value    Value    Value
D     Value    Value    Value
E     Value    Value    Value
F     Value    Value    Value
.
.
.
  

Я бы хотел, чтобы это выглядело вот так.

   Time   Letter  Variable
1/1/2020   A       Value
1/1/2020   B       Value
1/1/2020   C       Value
.          .         .
.          .         .
.          .         .
  

Комментарии:

1. Добро пожаловать в Stack Overflow. Не могли бы вы включить некоторые примеры данных или использовать данные, которые поставляются с пакетом R, как часть вашего вопроса? Это облегчает нам задачу помочь вам.

Ответ №1:

Что вам нужно, так это изменить форму данных. Вот tidyverse подход:

 library(tidyverse)
#Reshape data
df %>% pivot_longer(cols = -Var) %>%
  pivot_wider(names_from = Var,values_from=value)
  

Выходной сигнал:

 # A tibble: 3 x 7
  name       A     B     C     D     E     F    
  <chr>      <chr> <chr> <chr> <chr> <chr> <chr>
1 01.01.2020 Value Value Value Value Value Value
2 01.02.2020 Value Value Value Value Value Value
3 01.03.2020 Value Value Value Value Value Value
  

Некоторые используемые данные:

 #Data
df <- structure(list(Var = c("A", "B", "C", "D", "E", "F"), `01.01.2020` = c("Value", 
"Value", "Value", "Value", "Value", "Value"), `01.02.2020` = c("Value", 
"Value", "Value", "Value", "Value", "Value"), `01.03.2020` = c("Value", 
"Value", "Value", "Value", "Value", "Value")), class = "data.frame", row.names = c(NA, 
-6L))
  

Если требуется только длинный формат, вы можете использовать следующий код (кредиты @r2evans) и функцию rownames_to_column() из tibble пакета:

 #Code
df %>% rownames_to_column('Var') %>%
  pivot_longer(cols = -Var)
  

Выходной сигнал:

 # A tibble: 18 x 3
   Var   name       value
   <chr> <chr>      <chr>
 1 A     01.01.2020 Value
 2 A     01.02.2020 Value
 3 A     01.03.2020 Value
 4 B     01.01.2020 Value
 5 B     01.02.2020 Value
 6 B     01.03.2020 Value
 7 C     01.01.2020 Value
 8 C     01.02.2020 Value
 9 C     01.03.2020 Value
10 D     01.01.2020 Value
11 D     01.02.2020 Value
12 D     01.03.2020 Value
13 E     01.01.2020 Value
14 E     01.02.2020 Value
15 E     01.03.2020 Value
16 F     01.01.2020 Value
17 F     01.02.2020 Value
18 F     01.03.2020 Value
  

Данные, использованные для последней части, являются:

 #Data
df <- structure(list(`01.01.2020` = c("Value", "Value", "Value", "Value", 
"Value", "Value"), `01.02.2020` = c("Value", "Value", "Value", 
"Value", "Value", "Value"), `01.03.2020` = c("Value", "Value", 
"Value", "Value", "Value", "Value")), row.names = c("A", "B", 
"C", "D", "E", "F"), class = "data.frame")
  

Комментарии:

1. (1) Я думаю, что A , B , … были именами строк и, возможно, не были столбцом; и (2) Я думаю, что OP запросил более длинную версию, в которой нет необходимости pivot_wider ? (Заголовок вопроса может сбить с толку одного из нас.)

2. @r2evans Да, вы правы! Сейчас я обновлю ответ.

Ответ №2:

Мы можем использовать transpose из data.table

 library(data.table)
data.table::transpose(df, make.names = 'Var')
  

данные

 df <- structure(list(`01.01.2020` = c("Value", "Value", "Value", "Value", 
"Value", "Value"), `01.02.2020` = c("Value", "Value", "Value", 
"Value", "Value", "Value"), `01.03.2020` = c("Value", "Value", 
"Value", "Value", "Value", "Value")), row.names = c("A", "B", 
"C", "D", "E", "F"), class = "data.frame")