у меня есть следующие данные:
Я БЫ | А | Б |
---|---|---|
1 | 4 | 2 |
2 | 5 | 3 |
Результат, который я хочу:
Я БЫ | С |
---|---|
1 | 4 |
1 | 2 |
2 | 5 |
2 | 3 |
Взгляните на tidyr
пакет и его pivot_longer()
функцию: df1 %>% pivot_longer(-ID, values_to = "C") %>% select(-name)
должно помочь.
melt(df, 'ID')
в основном у меня есть другие столбцы во входных данных, как я могу указать столбцы, которые я хочу переплавить в этой команде df1 %>% pivot_longer(-ID, values_to = "C") %>% select(-name)?
Вместо отмены выбора столбцов, которые вы не хотите pivot_longer()
(здесь: -ID
, вы можете выбрать их с помощью cols=c()
: df1 %>% pivot_longer(cols = c(A,B), values_to = "C") %>% select(-name)
В пакете cdata есть функции преобразования, которые поворачивают и разворачивают несколько переменных. Что мне нравится в пакете, так это идея управляющей таблицы, которая визуально упорядочивает данные в форме, которую вы хотите видеть.
В этом случае, начиная с фрейма данных df
,
ID <- c(1, 2)
A <- c(4, 5)
B <- c(2, 3)
df <- data.table(ID, A, B)
# check the data
df[]
#> ID A B
#> 1 1 4 2
#> 2 2 5 3
Создайте контрольную таблицу cdata. Это базовый элемент, который позволяет вам однозначно указать, какие значения данных куда идут. В этом случае я использую новую переменную from
для определения столбцов, из которых берутся значения, а C
— это новый столбец с желаемыми значениями.
# build a control table
from <- c("col_A", "col_B")
C <- c("A", "B")
control_table <- data.table(from, C)
# examine the result
control_table[]
#> from C
#> 1: col_A A
#> 2: col_B B
Когда контрольная таблица готова, я могу использовать rowrecs_to_blocks()
из cdata для преобразования данных из формы записи строки (широкой) в форму записи блока (более длинную). Переменная ID
повторяется столько раз, сколько необходимо для завершения записи блока.
# transform to block form
DT <- cdata::rowrecs_to_blocks(
wideTable = df,
controlTable = control_table,
columnsToCopy = c("ID"))
setDT(DT)
# examine the result
DT[]
#> ID from C
#> 1: 1 col_A 4
#> 2: 1 col_B 2
#> 3: 2 col_A 5
#> 4: 2 col_B 3
Вы можете опустить столбец from
, но, сохранив его, вы всегда сможете восстановить исходный фрейм данных, если вам нужно.
# omit the from column
DT[, from := NULL]
DT
#> ID C
#> 1: 1 4
#> 2: 1 2
#> 3: 2 5
#> 4: 2 3
Использование data.table
, где melt
— эквивалент dplyr
pivot_longer
dt <- data.table(ID = 1:2, A = 4:5, B = 2:3)
dt <- melt(dt, measure.vars = c("A", "B"), value.name = "C")
dt[, variable := NULL]
setorder(dt, ID) # to get the same order as your desired output
dt
# ID C
# 1: 1 4
# 2: 1 2
# 3: 2 5
# 4: 2 3
Просто используйте by
.
DT[, .(C = c(A, B)), by = ID]
# ID C
# <int> <int>
# 1: 1 4
# 2: 1 2
# 3: 2 5
# 4: 2 3
Воспроизводимые данные
DT = data.table(ID = 1:2, A = 4:5, B = 2:3)
Я использовал эту команду, чтобы ответить на мой вопрос:
df1 %>% pivot_longer(cols = c(A,B), values_to = "C") %>%
select(-name)
благодаря предыдущим комментариям Мартина Гала и Gnueghoidune
Отвечает ли это на ваш вопрос? Изменение формы data.frame из широкого в длинный формат