Импорт нескольких файлов .csv в R с разными именами

#r #csv #import #filenames

#r #csv #импорт #имена файлов

Вопрос:

У меня есть один рабочий каталог с 37 Locations.csv и 37 Behavior.csv

Смотрите ниже, где некоторые файлы имеют тот же номер, что и 111868-Behavior.csv и 111868-Behavior 2.csv , а также с Locations.csv

 #here some of the csv in the work directory

dir()
  [1] "111868-Behavior 2.csv"            "111868-Behavior.csv"             
  [3] "111868-Locations 2.csv"           "111868-Locations.csv"            
  [5] "111869-Behavior.csv"              "111869-Locations.csv"            
  [7] "111870-Behavior 2.csv"            "111870-Behavior.csv"             
  [9] "111870-Locations 2.csv"           "111870-Locations.csv"            
 [11] "112696-Behavior 2.csv"            "112696-Behavior.csv"             
 [13] "112696-Locations 2.csv"           "112696-Locations.csv"    
  

Я не могу изменить название файлов.

Я хочу импортировать все 36 местоположений и 36 поведений, но когда я попробовал это

 #Create list of all behaviors
bhv <- list.files(pattern="*-Behavior.csv")
bhv2 <- list.files(pattern="*-Behavior 2.csv")

#Throw them altogether
bhv_csv = ldply(bhv, read_csv)
bhv_csv2 = ldply(bhv2, read_csv)

#Join bhv_csv and bhv_csv2
b<-rbind(bhv_csv,bhv_csv2)

#Create list of all locations
loc <- list.files(pattern="*-Locations.csv")
loc2 <- list.files(pattern="*-Locations 2.csv")

#Throw them altogether
loc_csv = ldply(loc, read_csv)
loc_csv2 = ldply(loc2, read_csv)

#Join loc_csv and loc_csv2
l<-rbind(loc_csv,loc_csv2)
  

Показывает мне только 28, а не 36, как я предполагал

 length(unique(b$Ptt))
[1] 28

length(unique(l$Ptt))
[1] 28
  

Это число 28, примерно все Behaviors.csv и Locations.csv без Behaviors 2.csv и Locations 2.csv (те, у кого есть номер «2», в общей сложности составляют 8 каждый)

Я хочу импортировать все параметры поведения файлов и все местоположения таким образом, чтобы отображались 36 параметров поведения и местоположений. Как я могу это сделать?

Комментарии:

1. зачем вам нужны два отдельных list.files for Behavior ? Можете ли вы сделать list.files(pattern="Behavior") ? Он должен охватывать оба шаблона, а затем одинаковый для Locations ?

2. Я сделал это сейчас, в созданном списке отображается 36, но при запуске length(unique(b$Ptt)) пока показывает мне только 28..

3. Я не знаю, какой Ptt столбец имеет, но поскольку вам нужны два разных фрейма данных для «Поведения» и «Шаблона». Попробуйте выполнить, b <- rbindlist(lapply(list.files(pattern="Behavior", full.names = TRUE),fread)) и убедитесь, что вы data.table загрузили, потому что fread и rbindlist из data.table .

4. В столбце Ptt показаны номера каждого поведения или местоположения, например, 111868 или 111869 (например, каждое число — это одно животное 111868-Behavior 2.csv и 111868-Behavior.csv — это 2 животных), 36 чисел, но показано только 26. Я попробовал этот код, который вы мне сказали, но результат тот же

Ответ №1:

Вы можете использовать purrr::map для упрощения части вашего кода:

 library("tidyverse")
library("readr")

# Create two small csv files
write_lines("a,bn1,2n3,4", "file1.csv")
write_lines("a,cn5,6n7,8", "file2.csv")

list.files(pattern = "*.csv") %>%
  # `map` will cycle through the files and read each one
  map(read_csv) %>%
  # and then we can bind them all together
  bind_rows()
#> Parsed with column specification:
#> cols(
#>   a = col_double(),
#>   b = col_double()
#> )
#> Parsed with column specification:
#> cols(
#>   a = col_double(),
#>   c = col_double()
#> )
#> # A tibble: 4 x 3
#>       a     b     c
#>   <dbl> <dbl> <dbl>
#> 1     1     2    NA
#> 2     3     4    NA
#> 3     5    NA     6
#> 4     7    NA     8
  

Создано 2019-03-28 пакетом reprex (версия 0.2.1)