Использование цикла для выбора имен столбцов из списка - PullRequest
1 голос
/ 26 апреля 2019

Я боролся с выбором столбцов со списками в R. Я загрузил кучу CSV (все с разными именами столбцов и разным количеством столбцов) с целью извлечения всех столбцов, которые имеют одинаковое имя (просто phone_number, subregion и phonetype) и объединить их в один фрейм данных.

С помощью этого я могу получить нужные столбцы из одного элемента списка; var<-data[[1]] %>% select("phone_number","Subregion", "PhoneType")
Но я не могу выбрать столбцы из всех элементов списка таким образом, только по одному за раз.

Затем я попытался цикл for, который выглядит следующим образом:

    new.function <- function(a) {
  for(i in 1:a) {
   tst<-datas[[i]] %>% select("phone_number","Subregion", "PhoneType") 

  }
  print(tst)
}

Но когда я попробую:

    new.function(5)

Я получу столбцы только из 5-го элемента.

Я знаю, что для большинства это может показаться нубским вопросом, но я изо всех сил пытаюсь выучить списки и циклы и R. Я уверен, что упускаю что-то очень простое, чтобы сделать эту работу.Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Еще один способ сделать это - создать функцию, которая извлекает ваши столбцы и применяет ее ко всем data.frames в вашем списке с помощью lapply:

library(dplyr)

extractColumns = function(x){
  select(x,"phone_number","Subregion", "PhoneType")
  #or x[,c("phone_number","Subregion","PhoneType")]
}

final_df = lapply(data,extractColumns) %>% bind_rows()
1 голос
/ 26 апреля 2019

То, как вы сейчас настроили свой цикл, сохраняет только последнюю итерацию цикла, потому что tst не настроен на сохранение более одного значения и перезаписывается с каждым шагом цикла.

Сначала вы можете создать tst в виде списка:

tst <- list()

Тогда в вашем коде укажите, что каждый шаг сохраняется как отдельный элемент в списке путем добавления скобок и индекса к tst. Вот полный пример того, как вы это делали.

#Example data.frame that could be in datas
df_1 <- data.frame("not_selected" = rep(0, 5),
                   "phone_number" = rep("1-800", 5),
                   "Subregion"    = rep("earth", 5),
                   "PhoneType"    = rep("flip", 5))
# Another bare data.frame that could be in datas
df_2 <- data.frame("also_not_selected" = rep(0, 5),
                   "phone_number" = rep("8675309", 5),
                   "Subregion"    = rep("mars", 5),
                   "PhoneType"    = rep("razr", 5))

# Datas is a list of data.frames, we want to pull only specific columns from all of them
datas <- list(df_1, df_2)

#create list to store new data.frames in once columns are selected
tst <- list()

#Function for looping through 'a' elements
new.function <- function(a) {

  for(i in 1:a) {

    tst[[i]] <- datas[[i]] %>% select("phone_number","Subregion", "PhoneType") 

  }

  print(tst)
}

#Proof of concept for 2 elements
new.function(2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...