Существует метод data.table для внутреннего соединения, который очень эффективен для времени и памяти (и необходим для некоторых более крупных data.frames):
library(data.table)
dt1 <- data.table(df1, key = "CustomerId")
dt2 <- data.table(df2, key = "CustomerId")
joined.dt1.dt.2 <- dt1[dt2]
merge
также работает с данными .tables (поскольку он является общим и вызывает merge.data.table
)
merge(dt1, dt2)
data.table, зарегистрированный в stackoverflow: Как выполнить операцию слияния данных.table Перевод SQL присоединяется к внешним ключам к синтаксису R data.table . Эффективные альтернативы слиянию для больших данных. Кадры R Как сделать базовое левое внешнее соединение с data.table в R?
Еще одна опция - функция join
, найденная в пакете plyr
library(plyr)
join(df1, df2,
type = "inner")
# CustomerId Product State
# 1 2 Toaster Alabama
# 2 4 Radio Alabama
# 3 6 Radio Ohio
Опции для type
: inner
, left
, right
, full
.
Из ?join
: В отличие от merge
, [join
] сохраняет порядок x независимо от того, какой тип соединения используется.
Для начала я бы поставил точку останова и посмотрел, как выглядит ваш объект ответа с любой конечной точки, на которую вы попали. Возможно, это действительно первые три элемента массива?
Переходя к конкретному вопросу, я бы использовал протокол Codable
для расшифровки вашего ответа. Я пропущу часть Alamofire и сосредоточусь исключительно на расшифровке объекта. Используя ваш пример, вот как будет выглядеть структура:
struct ResponseObject: Codable {
let name: String
let location: String
}
Я бы не использовал оператор взрыва (!
) в вашем коде, так как вы сгенерируете исключение, если скажете компилятору, что это 100% гарантированных денег в банке объект не ноль и это на самом деле. Вместо этого разверните дополнительные.
Вам понадобится место для ваших декодированных данных, чтобы вы могли объявить пустой массив ответов следующим образом:
var arrayOfObjects: [ResponseObject] = []
Затем вы просто объявите декодер и расшифруете свои данные. :
let decoder = JSONDecoder()
do {
if let data = rawData {
arrayOfObjects = try decoder.decode([ResponseObject].self, from: data)
print("number of objects:", arrayOfObjects.count)
let slice = arrayOfObjects.prefix(3)
arrayOfObjects = Array(slice)
print("number of objects after slicing the array:", arrayOfObjects.count)
}
} catch {
print(error)
}
Вместо циклического перемещения по массиву, просто возьмите первые три элемента массива с помощью .prefix(3)
. Поигравшись с этим только сейчас, я попытался добавить к первым 10 элементам массива префикс с 4, и он не сгенерировал исключение, поэтому я думаю, что это должно сработать без предварительной проверки счетчика массива.
Я бы посоветовал взглянуть на документацию Swift онлайн по адресу: Arrays, или вы можете получить довольно симпатичное приложение для Mac OS под названием Dash, которое позволяет вам загружать наборы документов для нескольких языков на вашем компьютере локально.
Удачи!