Использование позиции в одном списке для чтения в файле из другого списка в R - PullRequest
0 голосов
/ 20 января 2020

У меня есть вектор названий городов под названием cities:

> cities
[1] 'amsterdam' 'atlanta' 'bangalore'
[4] 'bogota' 'boston' 'brisbane'
[7] 'brussels' 'cairo' 'cape'

У меня есть две папки, в которых присутствуют одинаковые города и они упорядочены одинаково. Я превратил каждую папку в список. Каждый файл в list1 содержит географические данные c для одного города. Каждый файл в list2 содержит данные о времени в пути для одного города.

> list1
[[1]]
[1] "C:/geo/amsterdam.json"
[[2]]
[1] "C:/geo/atlanta.json"
[[3]]
[1] "C:/geo/bangalore.json"

> list2
[[1]]
[1] "C:/time/amsterdam.csv"
[[2]]
[1] "C:/time/atlanta.csv"
[[3]]
[1] "C:/time/bangalore.csv"

Я хотел бы написать oop,

  • На основе положения города в cities,
  • читает в соответствующем файле из list1,
  • читает в соответствующем файле из list2,
  • объединяет два набора данных в набор данных, имя которого соответствует позиции индекса в cities

Примерно так:

for (i in length(cities)){
geo <- (sf::st_read(list1[i])
time <- (data.table::fread(list2[i])
merged[i] <- merge(geo, time, by='id') #both datasets have an 'id' column
}

В настоящее время этот l oop выдает ошибку number of items to replace is not a multiple of replacement length. Когда я пытаюсь проиндексировать каждый вывод (то есть geo[i] <- (sf::st_read(list1[i]) ...), я получаю ошибку new columns would leave holes after existing columns.

Есть ли способ выполнять операции над элементами списка на основе положения этих элементов (или их эквивалента) в другом списке / векторе?

1 Ответ

0 голосов
/ 24 февраля 2020

Решение состоит в том, чтобы инициализировать перед l oop пустой список, который получит merged фреймы данных:

merged=list()

for (i in length(cities)){
    geo <- (sf::st_read(list1[i])
    time <- (data.table::fread(list2[i])
    merged[i] <- merge(geo, time, by='id') #both datasets have an 'id' column
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...