Я импортирую несколько CSV-файлов шириной в два столбца (они выводятся программой) - первый столбец - это длина волны, а второй - поглощение, но я называю его по имени файла, который нужно объединить. позже, как из этого старого ответа на переполнение стека ( Объединение файлов csv в R в разные столбцы ). Входящие .csvs не имеют заголовков, и я знаю, что то, как я их называю, обрезает первые точки данных. Я бы хотел, чтобы первый столбец не имел десятичных знаков и стандартизировал все числа до четырех цифр - код, который я добавил, работает сам по себе, но не в этом блоке - и я бы предпочел выполнить это форматирование все в одном go. Я сталкиваюсь с ошибками из-за того, что $ неправильный оператор, но когда я использую [], я тоже получаю ошибки об этом. Столбец, с которым мне нужно это сделать, является первым и называется «Длина волны», что также дает мне ошибки, потому что длина волны не существует или не имеет числа c. Есть идеи?
Вот как сейчас выглядит мой скрипт:
for (file in file_list) {
f <- sub("(.*)\\.CSV", "\\1", file)
assign(f, read.csv(file = file))
assign(f, setNames(get(f), c(names(get(f))[0:0], "Wavelength")))
assign(f, setNames(get(f), c(names(get(f))[1:1], file)))
floor(f[Wavelength]) #the issues are here
sprintf("%04d", f$Wavelength) #and here
}
Данные в CSV выглядят так до обработки:
1 401.7664 0.1379457
2 403.8058 0.1390427
3 405.8452 0.1421666
4 407.8847 0.1463629
5 409.9241 0.1477264
I хотел бы, чтобы результат был:
Wavelength (file name)
1 0401 0.1379457
2 0403 0.1390427
3 0405 0.1421666
4 0407 0.1463629
5 0409 0.1477264
А вот dput, который запрашивал r2evans:
structure(list(X3.997270e.002 = c(401.7664, 403.8058, 405.8452,
407.8847, 409.9241, 411.9635), X1.393858e.001 = c(0.1379457,
0.1390427, 0.1421666, 0.1463629, 0.1477264, 0.1476971)), row.names =
c(NA,
6L), class = "data.frame")
Заранее спасибо!
6/24 Обновление: Когда я назначаю имя столбца «Длина волны», оно добавляется только как символ, а не как настоящее имя столбца? Когда я отправляю / возглавляю файлы после того, как они go прошли (без функций sprintf / floor), отображается только имя файла (второй столбец). Когда я открываю csvs в R studio, первый столбец правильно помечен - и даже дальше я могу объединить все csvs, отсортированные по "длине волны":
list_csvs <- mget(sub("(.*)\\.CSV", "\\1", file_list))
all_csvs <- Reduce(function(x, y) merge(x, y, all=T,
by=c("Wavelength")), list_csvs, accumulate=F)
Естественно, я думал только о форматировании столбец после этого, но некоторые десятичные дроби отключены в разряде тысяч, поэтому мне нужно отформатировать, прежде чем объединять csvs.
Я обновил код, чтобы использовать имена столбцов вне read.csv:
for (file in file_list) {
f <- sub("(.*)\\.CSV", "\\1", file)
assign(f, read.csv(file = file,
header = FALSE,
row.names = NULL))
colnames(f) <- c("Wavelength", file)
print(summary(f))
print(names(f))
#floor("Wavelength") #I'm omitting this to see the console errors
#sprintf("%04.0f", f["Wavelength"]) #omitting this too
}
, но я получаю следующую ошибку:
attempt to set 'colnames' on an object with less than two dimensions
Без бита именования и без sprintf / floor я получаю это обратно из сводки и запроса имен для каждого файла:
Length Class Mode
1 character character
NULL
Когда я пытаюсь вызвать первый столбец с помощью f [1], f [[1]], f [, 1] или f [[, 1]], я получаю сообщения об ошибках: неправильное количество размеров ». В среде R я ясно вижу, что каждый фрейм данных имеет длину 2. Я также дважды проверил с помощью .row_names_info(f)
, что первый столбец не читается как имена строк. Что я делаю не так?