#r #data-analysis
#r #анализ данных
Вопрос:
У меня есть следующий код на R для анализа одного набора данных:
da_if <- function(x, TYPE) {
data <-read.csv(x,sep = "", skip = 61, na.strings = "NA",header = F, col.names = paste0("V", seq_len(6)), fill = TRUE) #skips first 61 lines due to those lines all being settings and makes six columns
data$V2 <- as.factor(data$V2)
data$V5 <- as.numeric(data$V5)
data$V6 <-as.numeric(data$V6) # 8amp;9 are needed in order so sum up values and get rid of two words!
y <- split(data, data$V2)
if (TYPE == "SCALES") {
y <- y$SCALES
y[is.na(y)]=0
y$V5<-y$V5 y$V6
y<-y[,-6]
return(y)
} else if (TYPE == "TRACK") {
y <- y$TRACK
return(y)
} else if (TYPE == "RESMAN") {
y<- y$RESMAN
return(y)
} else if (TYPE == "COMMUN"){
y <- y$COMMUN
return(y)
} else {print("Insert valid datatype...")}
}
И у меня есть список файлов для анализа, сгенерированный этим кодом:
fta<-list.files(pattern=".log", full.names = T) #files to analyse
Есть ли какой-либо способ изменить мою функцию, чтобы анализировать 32 набора данных одновременно? Я пытался использовать apply, но, честно говоря, я не могу сохранить результаты в 32 разных переменных для дальнейшего анализа данных, и по какой-то причине я слишком глуп, чтобы написать цикл for, который действительно что-то делает… На данный момент я просто хотел бы проанализировать масштабную часть своих данных.
Заранее всем спасибо!!
Редактировать: мои необработанные данные выглядят примерно так и являются частью многозадачного упражнения NASA Toolbox:
14:29:00.467154 TRACK STATE CURSOR X 0.012751340110832256
14:29:00.467154 TRACK STATE CURSOR Y -0.08704373265652304
14:29:00.487683 TRACK STATE CURSOR X 0.012479403159392622
14:29:00.488668 TRACK STATE CURSOR Y -0.08733692625790845
14:29:00.491681 MAIN STATE PAUSE
14:29:00.515652 MAIN STATE GENERICSCALES START
14:30:53.308644 SCALES INPUT Mentale Anforderung 7
14:30:53.309640 SCALES INPUT Körperliche Beanspruchung 6
14:30:53.310467 SCALES INPUT Zeitdruck 5
14:30:53.311462 SCALES INPUT Leistung 3
14:30:53.311462 SCALES INPUT Anstrengung 7
14:30:53.312459 SCALES INPUT Frustration 5
14:30:53.316458 MAIN STATE RESUME
14:30:53.319470 MAIN STATE PUMPSTATUS STOP
14:30:53.320461 MAIN STATE RESMAN STOP
14:30:53.321456 MAIN STATE SYSMON STOP
14:30:53.322470 MAIN STATE COMMUNICATIONS STOP
Ответ №1:
Не храните данные в 32 разных переменных. Использование lapply
и хранение данных в виде списка :
list_data <- lapply(fta, da_if, TYPE = 'SCALES')
Если вы хотите объединить список данных в один, вы можете использовать
combine_data <- do.call(rbind, list_data)
Комментарии:
1. Большое спасибо за ваш ответ! Результат, который я получаю, таков: ошибка в read.table(file = file, header = header, sep = sep, quote = quote, : больше столбцов, чем имен столбцов Есть ли какой-либо способ исправить это? Если я дополнительно установлю для своих столбцов значение seq_len равным 7, я получу $ operator недопустимо для атомарных векторов…
2. Итак, я просто еще покопался и выяснил, что fta — это список с 37 файлами журналов. Эти файлы журналов содержат около 12000 строк каждый, грубо говоря, мне как-то нужно сообщить функции lapply, что она должна поместить все пути, хранящиеся в fta, как x в функцию da_if. Я как-то застрял там…
3. Попробуйте
unlist
список.list_data <- lapply(unlist(fta), da_if, TYPE = 'SCALES')
4. Большое спасибо! Я допустил ошибку с моими необработанными данными, и это сработало хорошо!