несколько столбцов data.table в один столбец векторов

#r #data.table

Вопрос:

У меня есть таблица данных, подобная этой:

 tab = data.table(V1 = c('a', 'b', 'c'),  V2 = c('d', 'e', 'f'),  V3 = c('g', 'h', 'i'),  id = c(1,2,3))  

Из столбцов V1,V2,V3 этой таблицы я хотел бы получить для строки i вектор c(V1[i],V2[i], V3[i])

Я могу получить список нужных векторов следующим образом:

 lapply(1:tab[, .N], function(x) tab[x, c(V1, V2, V3)])  

Который возвращает:

 [[1]] [1] "a" "d" "g"  [[2]] [1] "b" "e" "h"  [[3]] [1] "c" "f" "i"  

Но я думаю, что это, вероятно, медленно и не очень похоже на данные.таблица.

Кроме того, я хотел бы обобщить это, сделать так, чтобы у меня не было явного типа V1, V2, V3, а скорее передать вектор имен столбцов, которые будут обработаны таким образом.

Ответ №1:

Попробуй это?

 gt; asplit(unname(tab[, V1:V3]), 1) [[1]] "a" "d" "g"  [[2]] "b" "e" "h"  [[3]] "c" "f" "i"  

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

1. Я думаю unname , что удалю атрибут имен asplit(unname(tab[, V1:V3]), 1)

2. @akrun Хороший совет! Спасибо тебе, братан 🙂

Ответ №2:

С помощью split

 split(as.matrix(tab[, V1:V3]), tab$id) 
 #r #data.table



Вопрос:

У меня есть таблица данных, подобная этой:
 tab = data.table(V1 = c('a', 'b', 'c'),  V2 = c('d', 'e', 'f'),  V3 = c('g', 'h', 'i'),  id = c(1,2,3))  

Из столбцов V1,V2,V3 этой таблицы я хотел бы получить для строки i вектор c(V1[i],V2[i], V3[i])

Я могу получить список нужных векторов следующим образом:

 lapply(1:tab[, .N], function(x) tab[x, c(V1, V2, V3)])  

Который возвращает:

 [[1]] [1] "a" "d" "g"  [[2]] [1] "b" "e" "h"  [[3]] [1] "c" "f" "i"  

Но я думаю, что это, вероятно, медленно и не очень похоже на данные.таблица.

Кроме того, я хотел бы обобщить это, сделать так, чтобы у меня не было явного типа V1, V2, V3, а скорее передать вектор имен столбцов, которые будут обработаны таким образом.

Ответ №1:

Попробуй это?

 gt; asplit(unname(tab[, V1:V3]), 1) [[1]] "a" "d" "g"  [[2]] "b" "e" "h"  [[3]] "c" "f" "i"  

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

1. Я думаю unname , что удалю атрибут имен asplit(unname(tab[, V1:V3]), 1)

2. @akrun Хороший совет! Спасибо тебе, братан 🙂

Ответ №2:

С помощью split

1` [1] "a" "d" "g"

#r #data.table

Вопрос:

У меня есть таблица данных, подобная этой:

 tab = data.table(V1 = c('a', 'b', 'c'),  V2 = c('d', 'e', 'f'),  V3 = c('g', 'h', 'i'),  id = c(1,2,3))  

Из столбцов V1,V2,V3 этой таблицы я хотел бы получить для строки i вектор c(V1[i],V2[i], V3[i])

Я могу получить список нужных векторов следующим образом:

 lapply(1:tab[, .N], function(x) tab[x, c(V1, V2, V3)])  

Который возвращает:

 [[1]] [1] "a" "d" "g"  [[2]] [1] "b" "e" "h"  [[3]] [1] "c" "f" "i"  

Но я думаю, что это, вероятно, медленно и не очень похоже на данные.таблица.

Кроме того, я хотел бы обобщить это, сделать так, чтобы у меня не было явного типа V1, V2, V3, а скорее передать вектор имен столбцов, которые будут обработаны таким образом.

Ответ №1:

Попробуй это?

 gt; asplit(unname(tab[, V1:V3]), 1) [[1]] "a" "d" "g"  [[2]] "b" "e" "h"  [[3]] "c" "f" "i"  

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

1. Я думаю unname , что удалю атрибут имен asplit(unname(tab[, V1:V3]), 1)

2. @akrun Хороший совет! Спасибо тебе, братан 🙂

Ответ №2:

С помощью split

2` [1] "b" "e" "h"

#r #data.table

Вопрос:

У меня есть таблица данных, подобная этой:

 tab = data.table(V1 = c('a', 'b', 'c'),  V2 = c('d', 'e', 'f'),  V3 = c('g', 'h', 'i'),  id = c(1,2,3))  

Из столбцов V1,V2,V3 этой таблицы я хотел бы получить для строки i вектор c(V1[i],V2[i], V3[i])

Я могу получить список нужных векторов следующим образом:

 lapply(1:tab[, .N], function(x) tab[x, c(V1, V2, V3)])  

Который возвращает:

 [[1]] [1] "a" "d" "g"  [[2]] [1] "b" "e" "h"  [[3]] [1] "c" "f" "i"  

Но я думаю, что это, вероятно, медленно и не очень похоже на данные.таблица.

Кроме того, я хотел бы обобщить это, сделать так, чтобы у меня не было явного типа V1, V2, V3, а скорее передать вектор имен столбцов, которые будут обработаны таким образом.

Ответ №1:

Попробуй это?

 gt; asplit(unname(tab[, V1:V3]), 1) [[1]] "a" "d" "g"  [[2]] "b" "e" "h"  [[3]] "c" "f" "i"  

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

1. Я думаю unname , что удалю атрибут имен asplit(unname(tab[, V1:V3]), 1)

2. @akrun Хороший совет! Спасибо тебе, братан 🙂

Ответ №2:

С помощью split

3` [1] "c" "f" "i"

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

1. И если бы я хотел сохранить результат в таблице данных в виде столбца списка типов, мне все равно нужно было бы превратить все три столбца в матрицу?

2. @ira Вы также можете сделать tab[, new_col := split(as.matrix(.SD), id), .SDcols = V1:V3] , если намерены создать новый столбец списка

Ответ №3:

 as.list(transpose(tab[, .(V1, V2, V3)]))  

Или как функция

 tdt lt;- function(DT, cols) as.list(transpose(DT[, .SD, .SDcols = cols]))  tdt(tab, c('V1', 'V2', 'V3'))  # $V1 # [1] "a" "d" "g" #  # $V2 # [1] "b" "e" "h" #  # $V3 # [1] "c" "f" "i"  

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

1. Будет ли это хорошо работать даже для больших таблиц с миллионами строк?

2. @ira Я думаю, что это очень быстрый способ выполнить задачу, но не уверен, насколько это эффективно для памяти.

3. @ira немного протестировал файл с 10 миллионами строк, и для этой базы данных это решение заняло около 1,5 минут по сравнению с 1 минутой для решения ThomasIsCoding

Ответ №4:

 tab[, 1:3] |gt; transpose() |gt; as.list()  $V1 [1] "a" "d" "g"  $V2 [1] "b" "e" "h"  $V3 [1] "c" "f" "i"