#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")