Я хотел бы добавить новый столбец в мою таблицу данных, которая содержит данные из одного из других столбцов. Однако выбор столбца зависит от строки в зависимости от содержимого другого столбца. Итак:Сортировка данных из другого столбца в строке таблицы данных, в зависимости от текста другого столбца
для набора данных:
a_data b_data column_choice
[1,] 55 1 a
[2,] 56 2 a
[3,] 57 3 b
порождена:
dat=data.table(a_data = c(55, 56, 57),
b_data = c(1, 2, 3),
column_choice = c("a", "a", "b"))
Я хотел бы новый столбец, 'выбранный', который содержит (для каждой строки) либо данные из «a_data» или «b_data», в зависимости от значения «column_choice». Таким образом, результирующая таблица данных будет:
a_data b_data column_choice chosen
[1,] 55 1 a 55
[2,] 56 2 a 56
[3,] 57 3 b 3
мне удалось получить желаемый эффект, используя:
dat=dat[, data.table(.SD, chosen=.SD[[paste0(.SD$column_choice, "_data")]]),
by=1:nrow(a)]
dat$nrow = NULL
однако это чувствует себя довольно неуклюжим; возможно, есть более простой способ сделать это (это, несомненно, также научит меня чему-то о R)?
На практике в кадре данных также имеется множество других столбцов, которые необходимо сохранить, больше вариантов, чем просто «a» или «b», и некоторые из этих типов столбцов для генерации, поэтому я бы предпочел не использовать базовое решение ifelse
, которое может быть применимо для основного примера выше.
Большое спасибо за помощь.
Doh! Очень приятно группировать по столбцу_choice, +1. Должен быть способ избежать 'cbind()' и сократить время еще больше. Отличный тестовый пример для ': =' по группе, когда он реализован. –
Хорошее редактирование с помощью ': =' по группам. В идеале мы хотим избежать использования '.SD' для эффективности (чтобы сохранить заселение' .SD' со всеми теми столбцами, которые не нужны для каждой группы). Может быть: 'myDat [, selected: = myDat [[paste0 (column_choice," _ data ")]] [. I], by = column_choice]'. Если это работает, это должно быть значительно быстрее, так как число столбцов 'myDat' растет. –