Сложить два столбца в один (data.table) в r

у меня есть следующие данные:

Я БЫАБ
142
253

Результат, который я хочу:

Я БЫС
14
12
25
23

Отвечает ли это на ваш вопрос? Изменение формы data.frame из широкого в длинный формат

Martin Gal 22.03.2022 23:58

Взгляните на tidyr пакет и его pivot_longer() функцию: df1 %>% pivot_longer(-ID, values_to = "C") %>% select(-name) должно помочь.

Martin Gal 22.03.2022 23:59
melt(df, 'ID')
KU99 23.03.2022 00:12

в основном у меня есть другие столбцы во входных данных, как я могу указать столбцы, которые я хочу переплавить в этой команде df1 %>% pivot_longer(-ID, values_to = "C") %>% select(-name)?

chay 23.03.2022 00:16

Вместо отмены выбора столбцов, которые вы не хотите pivot_longer() (здесь: -ID, вы можете выбрать их с помощью cols=c(): df1 %>% pivot_longer(cols = c(A,B), values_to = "C") %>% select(-name)

Gnueghoidune 23.03.2022 00:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
58
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В пакете 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 — эквивалент dplyrpivot_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

Другие вопросы по теме