извлечь содержимое столбца в списке данных фрейма R - PullRequest
0 голосов
/ 24 мая 2018

У меня 1900 файлов.Я импортировал их в среду R.

temp<-list.files(pattern="foodconsumption")

В каждом файле по 300 столбцов.

Я хотел бы взять только данные из столбца 25 и связать их все вместе с одного конца додругое.

Я знаю о lapply, но я не знаю, как написать функцию для извлечения только столбца.25 (с именем V25)

Я смотрел какое-то учебное пособие онлайн, и оно использует fucntion (elt).

lapply(temp, function(elt), elt[,25])

но я получил эту ошибку: Ошибка в [.default (elt,, 25): неверное количество измерений

Есть ли более простой способ сделать это?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 мая 2018
library(tidyverse)
list.files(pattern = ".csv") %>% 
    map_dfc( ~read_csv(.x) %>%  # map_dfc: column combined to dataframe 
              select(2) # choose columns
           )
0 голосов
/ 24 мая 2018

Вы, возможно, уже знаете об этом (в таком случае, я извиняюсь), но функция list.files делает именно это - она ​​выводит вектор всех файлов, удовлетворяющих критерию шаблона.На самом деле он не импортирует файлы.Я бы настроил вашу процедуру следующим образом.

Обратите внимание, что я предполагаю, что вы имеете дело с файлами .csv.Это должно работать с соответствующими изменениями для любых текстовых файлов.Дополнительные пакеты необходимы, если они являются файлами .xlsx.Если они являются .Rdata файлами, необходимы другие модификации.

files <- list.files(pattern = "foodconsumption")
result <- sapply(files, function(file) {
   # read in file
   temp <- read.csv(file) # adjustments may be needed for headers, etc.

   # return column 25
   temp[,25]
})

Если предположить, что каждый файл имеет одинаковое количество строк, на выходе получается матрица с 25 столбцами и строками, равными строкам вфайлы.Чтобы сделать эквивалент rbind, мы просто возьмем транспонирование:

t(result)

Если число строк отличается, выводится список, и транспонирование не будет работать.В этом случае вам нужно будет заполнить пропущенные значения:

max_length <- max(sapply(result, length))
result_mat <- sapply(result, function(x) {
  if (length(result) < max_length) c(result, rep(NA, max_length - length(result)))
  else result
})

Обратите внимание, что это неявно предполагает, что все недостающие данные находятся в конце, и / или что порядок данных в каждом файлене имеет значения.Если это не так, будьте очень осторожны с созданием матрицы здесь - может быть, лучше работать с данными в виде списка.

...