#r #list #rest #loops #post
Вопрос:
Мне нужно иметь возможность извлекать значения из соответствующих столбцов фрейма данных и вставлять их в определенную позицию в функции/цикле.
Мой фрейм данных: это df «новых начинающих» (новых сотрудников).
id <- c(115, 115)
f_name <- c("John", "Mary")
l_name <- c("Black", "White")
gender <- c("Male", "Female")
s_date <- c("2021-03-01", "2021-03-01")
ns_df <- data.frame(id, f_name, l_name, gender, s_date)
Это дает следующее:
id f_name l_name gender s_date
1 115 John Black Male 2021-03-01
2 115 Mary White Female 2021-03-01
Затем я хочу взять каждое из значений столбца и поместить их в соответствующее место в запросе POST, который выглядит следующим образом:
POST(url = myurl, config = authenticate(user = login,
password = pw,
type = "basic"),
body = list(APIKey = my_key, # keep the same
Action = "CreateNewEmployee", # keep the same
EmployeeId = "id", # loop through ids
FirstName = "f_name", # loop through first names
LastName = "l_name", # look through last names
Gender = "gender", # loop through genders
StartDate = "s_date" #loop through start dates
),
encode = "json")
Желаемый результат заключается в следующем:
- Создается фрейм данных с новыми началами (может быть 0 строк, в этом случае никаких действий не следует). Если это более 0 строк, то продолжайте
- В зависимости от количества строк запускается цикл для перебора каждой строки и извлечения атрибутов, чтобы каждый из них попал в соответствующую часть списка, которая составляет тело запроса POST
- Запрос на публикацию отправляется для каждой строки в новом фрейме данных starters
Я знаю, что мне нужно использовать функцию apply или цикл, который будет проходить через фрейм данных и подготавливать список(ы)/текст запроса POST, но я не совсем уверен, как собрать все это воедино! Любая помощь будет оценена по достоинству, спасибо вам всем.
Ответ №1:
Вы можете поместить код в функцию и применить его для каждой строки, используя любую команду apply.
lapply(seq(nrow(ns_df)), function(i) {
POST(url = myurl, config = authenticate(user = login,
password = pw,
type = "basic"),
body = list(APIKey = my_key, # keep the same
Action = "CreateNewEmployee", # keep the same
EmployeeId = ns_df[i, "id"], # loop through ids
FirstName = ns_df[i, "f_name"], # loop through first names
LastName = ns_df[i, "l_name"], # look through last names
Gender = ns_df[i, "gender"], # loop through genders
StartDate = ns_df[i, "s_date"] #loop through start dates
), encode = "json")
}) -> result
result
Если вывод каждого POST
запроса представляет собой фрейм данных, вам может потребоваться do.call(rbind, result)
объединить результаты в один фрейм данных.
Комментарии:
1. Спасибо, я воспользовался вашим предложением, но по какой — то причине запрос на публикацию API не проходит успешно, когда список в теле составляется в рамках функции — я попытался отправить данные, которые находятся в каждой из строк ns_df отдельно, и запрос на публикацию выполнен успешно-создается новый сотрудник. Выполнение этого в функции, даже цикл for с Sys.sleep (), похоже, не помогает. Есть какие-нибудь мысли, пожалуйста?
2. Изменится ли что-нибудь , если вы это сделаете
ns_df$id[i]
,ns_df$fname[i]
и то же самое для всех других ценностей?3. Привет, Ронак — да, это сработало — большое спасибо!