R: объединить списки одинаковой длины в список кортежей.

В настоящее время я борюсь со следующей проблемой в R: учитывая два списка a=(a1,...,an) и b=(b1,...,bn), я хочу получить список таких списков, как (( a1,b1),...,(an,bn)). Справочная информация: мне нужно преобразовать обычную таблицу/фрейм данных во вложенный json (например, с помощью jsonlite). В качестве примера кода рассмотрим таблицу данных с идентификаторами, широтами и долготами, причем последние два должны быть сведены в список с именем location:

library(data.table)
n<-5
data<-data.table(id=1:n,lon=1:n,lat=1:n)

Здесь мы могли бы использовать lapply для получения требуемого результата:

data$location<-lapply(1:nrow(data),function(x) list(data[x,c("lat","lon"),with=F]) )

Альтернативное разделение (быстрее для небольших, медленнее для больших наборов данных):

data$location<-list(split(data[,c("lat","lon"),with=F],1:nrow(data)))

Оба прекрасно работают в небольших масштабах, но для n >> 10 ^ 5 на моей машине требуется много времени. Есть ли у вас какое-либо решение для ускорения вычислений?


person User9123    schedule 19.01.2017    source источник


Ответы (2)


Мы можем поместить подмножество Data.table в list после группировки по «id» в «data.table» и извлечь новый столбец по умолчанию «V1».

data[, location := list(list(.SD)), id]

Мы можем извлечь столбец list

data$location
#[[1]]
#   lon lat
#1:   1   1

#[[2]]
#   lon lat
#1:   2   2

#[[3]]
#   lon lat
#1:   3   3

#[[4]]
#   lon lat
#1:   4   4

#[[5]]
#   lon lat
#1:   5   5
person akrun    schedule 19.01.2017

Вы можете использовать data.table::transpose как еще один вариант:

data[, location := transpose(.(lon, lat))]

data
#   id lon lat location
#1:  1   1   1      1,1
#2:  2   2   2      2,2
#3:  3   3   3      3,3
#4:  4   4   4      4,4
#5:  5   5   5      5,5

data$location        # this drops the column names, you can refer to the elements by index
#[[1]]
#[1] 1 1

#[[2]]
#[1] 2 2

#[[3]]
#[1] 3 3

#[[4]]
#[1] 4 4

#[[5]]
#[1] 5 5
person Psidom    schedule 19.01.2017