Неизвестный результат команды select

У меня есть несколько файлов .csv (mydata_1, mydata_2,...) с одинаковым количеством столбцов и именами столбцов (разной длиной строк, если это помогает найти ответ). После их чтения в моей среде у них есть класс data.frame . Я помещал их все в list и теперь хочу select конкретных столбцов по имени из всех из них, в результате чего получается одно и то же имя переменной только с выбранными столбцами.

mydata_1 = matrix(c(1:21), nrow=3, ncol=7,byrow = TRUE) 
mydata_2 = matrix(c(1:21), nrow=3, ncol=7,byrow = TRUE) 
 colnames(mydata_1) = c(paste0("X","1":"7"))
 colnames(mydata_2) = c(paste0("X","1":"7"))

df1 = as.data.frame(mydata_1)
df2 = as.data.frame(mydata_2)

all_data = c(df1, df2)

class(all_data)
class(df1)

for (i in all_data){
  i = select(i,"X3":"X5")
  }

Моя команда for должна выводить кадры данных df1 и df2 всего с тремя столбцами (вместо предыдущих семи), но при запуске кода появляется сообщение об ошибке относительно команды select.

Ошибка в UseMethod("select_"): нет применимого метода для 'select_', примененного к объекту класса "c('integer', 'numeric')"

Как я могу получить рабочий результат моих новых dfs?


person Capt.Krusty    schedule 19.08.2019    source источник
comment
select не является базовой функцией R. Для тега r (наведите курсор, чтобы увидеть): укажите все небазовые пакеты с вызовами library().   -  person Parfait    schedule 19.08.2019


Ответы (2)


Первая проблема заключается в том, что вы пытаетесь создать список, используя c(df1, df2), а вам нужно использовать list(df1, df2).

Данные

library(dplyr)
library(purrr)

mydata_1 = matrix(c(1:21), nrow=3, ncol=7,byrow = TRUE) 
mydata_2 = matrix(c(1:21), nrow=3, ncol=7,byrow = TRUE) 
colnames(mydata_1) = c(paste0("X","1":"7"))
colnames(mydata_2) = c(paste0("X","1":"7"))

df1 = as.data.frame(mydata_1)
df2 = as.data.frame(mydata_2)

all_data = list(df1 = df1, df2 = df2)

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

all_data2 <- list()

for(i in 1:length(all_data)) {

all_data2[[i]] <- all_data[[i]] %>% select(X3, X4, X5)

}

попробуйте использовать map из purrr, который является частью пакета tidyverse, и получите более чистый код с тем же результатом.

# Down here the `.x` is replaced by each element of the list all_data
# in each iteration, ending wiht a list of two data frames

all_data2 = map(all_data, ~.x %>%
                select(X3, X4, X5))

person Johan Rosa    schedule 19.08.2019

Рассмотрим базовый R subset с аргументом select для выбора непрерывного столбца, завернутым в вызов lapply. В отличие от цикла for, lapply не требует, чтобы бухгалтерия переназначала каждый элемент обратно в список:

all_data <- list(df1 = df1, df2 = df2)

all_data_sub <- lapply(all_data, function(df) subset(df, select=X3:X5))
person Parfait    schedule 19.08.2019