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