Как перебирать столбцы фрейма данных со списками в результате в R?

#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")
 

Желаемый результат заключается в следующем:

  1. Создается фрейм данных с новыми началами (может быть 0 строк, в этом случае никаких действий не следует). Если это более 0 строк, то продолжайте
  2. В зависимости от количества строк запускается цикл для перебора каждой строки и извлечения атрибутов, чтобы каждый из них попал в соответствующую часть списка, которая составляет тело запроса POST
  3. Запрос на публикацию отправляется для каждой строки в новом фрейме данных 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. Привет, Ронак — да, это сработало — большое спасибо!