Применение функции к каждой строке фрейма данных, слияние данных и запись в файл CSV в R - PullRequest
0 голосов
/ 01 мая 2020

Цель

У меня есть фрейм данных в R, моя цель - чтобы каждая строка фрейма данных выполняла вызов API, извлекала данные в формате csv, затем объединяла два фрейма данных и добавляла новую отформатированную строку к CSV-файл. Я использовал функцию apply для l oop в каждой строке исходного df, но я пытался объединить два результирующих df и добавить их в файл.

Сначала ввод строки в мой get_temp Функция кажется вектором символов. Кажется, что ответ от вызова API автоматически преобразуется в dataframe с помощью функции read_csv. Моя цель состоит в том, чтобы просто объединить две стороны . Я предполагаю, что мне нужно было бы преобразовать вектор строки в фрейм данных, но я на самом деле не уверен, что это правильный подход, и я изо всех сил пытался это сделать.

Вот фрагмент кода, который я написал, чтобы попытаться достичь что:

get_temp <- function(row) {
    uri <- build_uri(latitude, longitude, start_date)
    response <- read_csv(uri)
    merged <- merge(response, row, by=0)
    write.table(merged, file = "temp_and_cases.csv", append = TRUE, sep = ",")
}

row является текущей строкой из cases_by_region df. ​​
response является результатом api_call.
cases_by_region был получен -> cases_by_region <- read_csv("cases_by_region.csv") и выглядит так:

State | admin2 |province_state | lat | longcombined_key | day | number_of_cases | total_cases
Abbreviation
Alabama | Autauga | Alabama | 32.53953 | -86.64408 | Autauga, Alabama, US | 2020-04-03 | 12 |   72 | AL | 

ответ API - это CSV, который выглядит так:

Address,Date time,Minimum Temperature,Maximum Temperature,Temperature,Dew Point,Relative Humidity,Heat Index,Wind Speed,Wind Gust,Wind Direction,Wind Chill,Precipitation,Precipitation Cover,Snow Depth,Visibility,Cloud Cover,Sea Level Pressure,Weather Type,Latitude,Longitude,Resolved Address,Name,Info,Conditions
"32.53953,-86.64408","04/03/2020",7.5,25.2,15.7,8.4,67.85,,8.7,,35.79,,0,0,,15.8,7.1,1016.3,"",32.53953,-86.64408,"32.53953,-86.64408","","","Clear"

Пока что написанный мной код действительно добавляется в файл CSV, но не совсем ожидаемым образом (странное объединение заголовков и отсутствие значений строк ...):

"Row.names","Address","Date time","Minimum Temperature","Maximum Temperature","Temperature","Dew Point","Relative Humidity","Heat Index","Wind Speed","Wind Gust","Wind Direction","Wind Chill","Precipitation","Precipitation Cover","Snow Depth","Visibility","Cloud Cover","Sea Level Pressure","Weather Type","Latitude","Longitude","Resolved Address","Name","Info","Conditions","y"

Эта часть применяется для применения функции get_temp к каждой строке cases_by_region

temps <- apply(cases_by_region, 1, get_temp)

Как можно объединить строку и ответ от API-интерфейса рядом, а затем добавить к каждой созданной строке файл temp_and_cases.csv в правильном формате CSV (дополнительная проблема заключается в том, что имена столбцов должны быть добавлены к файл csv только при первом вызове API)?

1 Ответ

0 голосов
/ 01 мая 2020

Попробуйте использовать это:

get_temp <- function(row) {
  uri <- build_uri(row$latitude, row$longitude, row$start_date)
  response <- readr::read_csv(uri)
  cbind(row, response)
}

temps <- do.call(rbind, lapply(split(cases_by_region, 
                               seq(nrow(cases_by_region))), get_temp))
write.csv(temps, "temp_and_cases.csv", row.names = FALSE)

Используя asplit, мы разбиваем каждую строку на разные кадры данных, передаем каждую строку в функцию get_temp, cbind row и response и, наконец, объединяем их в один кадр данных.

Мы можем написать CSV только один раз в конце для всего файла.

...