Как удалить строки из нескольких файлов .csv

В настоящее время я не уверен, как лучше всего это сделать, поэтому, если есть какие-либо предложения относительно более эффективного способа, я был бы признателен!

Для начала вот некоторые данные по игрушке:

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», при открытии которого я получаю сообщение об ошибке, сообщающее, что файл не существует. Есть ли лучший способ осуществить этот процесс для достижения желаемых результатов? Большое спасибо.

Вы где-то определили file_out? Кажется, это не включено в вопрос. А вы уверены, что эта строка работает:with(datalist, subset(datalist, !("stim" == ""))) -> datalist? Я ожидаю, что вам также потребуется выполнить фильтрацию в lapply. Часть with(), похоже, ничего не делает. Если в вашем образце кажется, что вы перезаписываете один и тот же файл "data.csv", будет создан только один файл, который будет содержать данные из второго data.frame, поскольку первый будет перезаписан.

MrFlick 17.04.2024 22:44

Кавычки вокруг stim в !("stim" == "") неправильные. Это совсем не то же самое использование, что и при именовании столбцов при создании df. Правильно: !(stim == "") или проще stim != ""

Rui Barradas 17.04.2024 22:56

@MrFlick да, извините, я забыл скопировать это в пост. Я отредактировал сообщение, включив в него определение file_out.

thefriendly_plague.doctor 17.04.2024 23:14

@RuiBarradas, когда я меняю кавычки вокруг стима, выдает ошибку о том, что объект не найден.

thefriendly_plague.doctor 17.04.2024 23:15

Смотрите мой ответ, я считаю, что он отвечает на ваш комментарий.

Rui Barradas 17.04.2024 23:16

@theFriendly_plague.doctor Проблема заключалась НЕ в том, что в различных фреймах данных в datalist не было столбца, а в том, что структура datalist содержала фреймы данных, встроенные в отдельные безымянные записи списка. Вам следовало бы зациклиться datalist. Руи был бы прав в ситуации, когда datalist был фреймом данных (чем НЕ был). Это был список фреймов данных, который не является фреймом данных. Вы могли бы это увидеть, если бы бежали str по datalist.

IRTFM 19.04.2024 03:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала создайте файлы для обработки.

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

Другие вопросы по теме