В настоящее время я не уверен, как лучше всего это сделать, поэтому, если есть какие-либо предложения относительно более эффективного способа, я был бы признателен!
Для начала вот некоторые данные по игрушке:
data <- data.frame(
"stim" = c("face", "object", " ", "pareidolia"),
"RT" = c(23, 24, 22, 25),
"Opac" = c(70, 60, 80, 65)
)
write.csv(data, "data.csv")
data <- data.frame(
"stim" = c("face", "pareidolia", " ", "pareidolia"),
"RT" = c(83, 24,52, 85),
"Opac" = c(70, 87, 8, 6)
)
write.csv(data, "data.csv")
В настоящее время я читаю несколько файлов .csv следующим образом:
library("tidyverse")
base :: setwd("filepath")
files <- base::list.files(
path = ("filepath"),
recursive = TRUE,
pattern = "*.csv"
)
Затем я создаю список фреймов данных с содержимым файла .csv и удаляю строки, соответствующие пустым ячейкам в столбце стимулирования каждого фрейма данных. Затем я создаю пути к файлам из имен списков.
datalist <- lapply(files, read.csv)
with(datalist, subset(datalist, !("stim" == ""))) -> datalist
file_out <- paste0(names(datalist), ".csv")
Наконец, я пытаюсь записать каждый фрейм данных в списке в отдельный файл .csv.
mapply(
function(x, y) write_csv(x, y),
datalist,
file_out
)
Проблема в том, что этот код, похоже, не работает. Он не выводит ни одного файла .csv, за исключением одного файла с простым названием «.csv», при открытии которого я получаю сообщение об ошибке, сообщающее, что файл не существует. Есть ли лучший способ осуществить этот процесс для достижения желаемых результатов? Большое спасибо.
Кавычки вокруг stim
в !("stim" == "")
неправильные. Это совсем не то же самое использование, что и при именовании столбцов при создании df. Правильно: !(stim == "")
или проще stim != ""
@MrFlick да, извините, я забыл скопировать это в пост. Я отредактировал сообщение, включив в него определение file_out.
@RuiBarradas, когда я меняю кавычки вокруг стима, выдает ошибку о том, что объект не найден.
Смотрите мой ответ, я считаю, что он отвечает на ваш комментарий.
@theFriendly_plague.doctor Проблема заключалась НЕ в том, что в различных фреймах данных в datalist
не было столбца, а в том, что структура datalist
содержала фреймы данных, встроенные в отдельные безымянные записи списка. Вам следовало бы зациклиться datalist
. Руи был бы прав в ситуации, когда datalist
был фреймом данных (чем НЕ был). Это был список фреймов данных, который не является фреймом данных. Вы могли бы это увидеть, если бы бежали str
по datalist
.
Сначала создайте файлы для обработки.
data <- data.frame(
"stim" = c("face", "object", " ", "pareidolia"),
"RT" = c(23, 24, 22, 25),
"Opac" = c(70, 60, 80, 65)
)
write.csv(data, "data1.csv")
data <- data.frame(
"stim" = c("face", "pareidolia", " ", "pareidolia"),
"RT" = c(83, 24,52, 85),
"Opac" = c(70, 87, 8, 6)
)
write.csv(data, "data2.csv")
Теперь проблема вопроса.
list.files
;lapply
анонимная функция для чтения данных, удаления всех ненужных пробелов из столбца stim
, подстановки data.frame и перезаписи его на диск.files <- list.files(
path = "~/Temp",
pattern = "data.*\\.csv",
full.names = TRUE
)
lapply(files,\(x) {
df1 <- read.csv(x)
df1$stim <- trimws(df1$stim)
df1 <- subset(df1, stim != "")
write.csv(df1, x, row.names = FALSE, quote = FALSE)
})
Теперь проверьте, что файлы были правильно сохранены.
lapply(files, read.csv)
#> [[1]]
#> X stim RT Opac
#> 1 1 face 23 70
#> 2 2 object 24 60
#> 3 4 pareidolia 25 65
#>
#> [[2]]
#> X stim RT Opac
#> 1 1 face 83 70
#> 2 2 pareidolia 24 87
#> 3 4 pareidolia 85 6
Created on 2024-04-17 with reprex v2.1.0
Вы где-то определили
file_out
? Кажется, это не включено в вопрос. А вы уверены, что эта строка работает:with(datalist, subset(datalist, !("stim" == ""))) -> datalist
? Я ожидаю, что вам также потребуется выполнить фильтрацию вlapply
. Частьwith()
, похоже, ничего не делает. Если в вашем образце кажется, что вы перезаписываете один и тот же файл"data.csv"
, будет создан только один файл, который будет содержать данные из второго data.frame, поскольку первый будет перезаписан.