#r #dataframe
#r #dataframe
Вопрос:
Я хотел бы попытаться выполнить следующее:
- У меня есть папка с сотнями файлов .csv, каждый из которых нужно извлечь и проанализировать только в R для их первого столбца — это относительные интенсивности ячеек.
- Я хотел бы, чтобы скрипт а) перебирал каталог, б) извлекал и импортировал каждый файл .csv в виде фрейма данных или вектора, в) помечал каждый с помощью восходящей системы маркировки и г) повторно объединял их для получения всеобъемлющего набора данных для дальнейшего анализа (каждый фрейм данных представляет собойразличная обработка ячеек)
Вот некоторый код, поскольку я получаю отрицательные отзывы за то, что не сделал этого иначе:
#data are sort of structured like this, as relative intensities of a cell from an image:
set.seed(1234)
df1 <- sample(100:1000, 100, replace = T)
df2 <- sample(100:1000, 100, replace = T)
df3 <- sample(100:1000, 100, replace = T)
df4 <- sample(100:1000, 100, replace = T)
df5 <- sample(100:1000, 100, replace = T)
#this will be the subfolder where all the .csvs are located, not as it is here:
my_direct <- "~./"
#this will be the list of files:
my_files <- list.files(path=my_direct, pattern="*.csv", full.names=TRUE)
#this should retrieve over 100 .csv files, all with just one column needed for further analysis:
#then I wanted to do this....
dfs <- lapply(myfiles, read.delim)
#but that just generates an amorphous blob of a list -
#I need each belonging to it's own column, labeled differently, so that I can cbind to generate a massive dataset
#so I tried this:
map(my_files, fread, select = 'Intensity Sum Ch=3 Img=1') %>%
bind_cols
#and it produced similar results or collapses the data
Я чувствую, что это прямо передо мной (делаю какую-то магию цикла for), но, похоже, я тоже не могу найти решение здесь.
Предложения?
Ответ №1:
Вот решение, использующее lapply
#this will be the subfolder where all the .csvs are located, not as it is here:
my_direct <- "~./"
#this will be the list of files:
my_files <- list.files(path=my_direct, pattern="*.csv", full.names=TRUE)
# read each file in list
data_list = lapply(my_files, function(i){
data <- read.csv(i, stringsAsFactors = F)
# Make changes to data as required
})
# merge all elements of list into data.table
data_dt <- setDT(
unlist(data_list, recursive = FALSE),
check.names = TRUE
)[]
Комментарии:
1. Спасибо за это. Но разве я не стал бы использовать
cbind
и нетrbind
? Мне нужны уникальные столбцы, потому что происходит то, что данные считываются, но затем накладываются друг на друга, и я понятия не имею, откуда они взялись. Они должны храниться в виде уникальных столбцов.2. Примите ответ, если он вам помог.
3. Он по-прежнему не запускается для меня. Я получаю следующую ошибку:
error in read.table(file = file, header = header, sep = sep, quote = quote, : more columns than column names