Я боролся с выбором столбцов со списками в 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. Я уверен, что упускаю что-то очень простое, чтобы сделать эту работу. Спасибо за помощь.
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()
То, как вы сейчас настраиваете цикл, сохраняет только последнюю итерацию цикла, потому что 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)
Похожие вопросы
Связанные вопросы
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.