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

Я могу получить нужные столбцы из одного элемента списка с этим; 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. Я уверен, что упускаю что-то очень простое, чтобы сделать эту работу. Спасибо за помощь.

r
1
JLA 26 Апр 2019 в 23:14

2 ответа

Лучший ответ

Другой способ сделать это - создать функцию, которая извлекает ваши столбцы и применяет ее ко всем 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()
2
Fino 26 Апр 2019 в 20:27

То, как вы сейчас настраиваете цикл, сохраняет только последнюю итерацию цикла, потому что 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)
1
Adam Kemberling 26 Апр 2019 в 20:35