2015-03-28 3 views
0

У меня есть папка с несколькими сотнями файлов csv. Я хочу использовать lappply для вычисления среднего значения одного столбца в каждом файле csv и сохранить это значение в новый файл csv, который будет иметь два столбца: Столбец 1 будет именем исходного файла. Столбец 2 будет средним значением для выбранного поля из исходного файла. Вот то, что я до сих пор:lapply r в один столбец csv-файла

setwd("C:/~~~~") 
list.files() 
filenames <- list.files() 
read_csv <- lapply(filenames, read.csv, header = TRUE) 
dataset <- lapply(filenames[1], mean) 
write.csv(dataset, file = "Expected_Value.csv") 

Который дает сообщение об ошибке:

предупреждение: В mean.default ("2pt.csv" [[1L]], ...): аргумент не является числовым или логическим: возвращение NA

Поэтому я думаю, что у меня есть 2 (по крайней мере) проблемы, которые я не могу понять.

Во-первых, почему бы не признать, что столбец 1 является числовым? Я дважды, triple проверил файлы csv, и я уверен, что этот столбец является числовым.

Во-вторых, как получить выходной файл, чтобы вернуть два столбца, как я описал выше? Я еще далеко не добрался до второй части.

Я хотел сначала перенести первую часть. Любая помощь приветствуется.

+0

в порядке. Я запускаю это на тестовом образце всего двумя файлами. Я запустил 'str' и' head', которые подтвердили, что столбец является числовым. Я не понимаю ваш комментарий, но вы все еще пытаетесь вычислить среднее значение в именах строк [1] ​​... Возможно, это моя проблема. Я не знаю, как указать конкретный столбец в файле csv при использовании 'lapply'. $, который я использую при вычислении среднего значения в столбце в одном файле, является недопустимым оператором. Я читал, что должен использовать [], но я не уверен, что это правильно для того, что я пытаюсь сделать. – Luke55122

ответ

1

Я не использовал lapply, но сделал что-то подобное. Надеюсь это поможет!

i= 1:2 ##modify as per need 

    ##create empty dataframe 
    df <- NULL 

    ##list directory from where all files are to be read 
    directory <- ("C:/mydir/") 

    ##read all file names from directory 
    x <- as.character(list.files(directory,,pattern='csv')) 
    xpath <- paste(directory, x, sep="") 

    ##For loop to read each file and save metric and file name 
    for(i in i) 
    { 
    file <- read.csv(xpath[i], header=T, sep=",") 
    first_col <- file[,1] 
    d<-NULL 
    d$mean <- mean(first_col) 
    d$filename=x[i] 
    df <- rbind(df,d) 
    } 

    ###write all output to csv 
    write.csv(df, file = "C:/mydir/final.csv") 

    CSV file looks like below 

    mean  filename 
    1999.000661 hist_03082015.csv 
    1999.035121 hist_03092015.csv 
0

Спасибо за два ответа. После большого обзора выясняется, что для моей цели был намного более простой способ. Файлы csv, которые были у меня были изначально в одном файле. Я разделил их на несколько файлов по местоположению. В то время я думал, что для каждого типа необходимо вычислить mean. Понятно, что это была ошибка. Я пошел в исходный файл и использовал aggregate. Код:

setwd("C:/~~") 
allshots <- read.csv("All_Shots.csv", header=TRUE) 
EV <- aggregate(allshots$points, list(Location = allshots$Loc), mean) 
write.csv(EV, file= "EV_location.csv") 

Это было простое решение. Еще раз спасибо или ответы. Мне нужно стать лучше на lapply для будущих проектов, чтобы они не пустая трата времени.

Смежные вопросы