rbind перезаписывает предыдущие данные в R - PullRequest
2 голосов
/ 10 апреля 2020

Итак, у меня было два вопроса, и я объединил решения, но, похоже, я плохо их реализую. ( Q1 Q2 )

Итак, я читаю файлы с использованием read_delim () и пытаюсь отфильтровать некоторые данные перед сохранением их в один тип данных.

data <- data.frame()
for (file in files){

  name = strsplit(file, split = "\\.")[[1]][1]

  tmp <- data %>% bind_rows(read_delim(file = file, delim = ";", col_types = cols(
    a = col_double(),
    b = col_double(),
    c = col_character()
    )) %>% mutate(filename = name)
    data_tmp <- tmp %>%
      filter(!str_detect(c, 'a'))
    data <- rbind(data, tmp_data)
}

Очевидно, проблема, возникшая у меня в первом вопросе, снова появилась. Похоже, что mutate (filename = name) всегда получает значение из последнего прочитанного элемента.

1 Ответ

1 голос
/ 10 апреля 2020

Мы могли бы сделать его более компактным, если бы использовали map. L oop поверх files, прочитайте данные с помощью read_delim, создайте столбец 'filename' с подстрокой имени файла, filter строк и преобразуйте его в один data.frame с _dfr суффиксом

library(purrr)
library(dplyr)
out <- map_dfr(files, ~ {
          file <- .x
         read_delim(file, delim = ";", col_types = cols(
            a = col_double(),
            b = col_double(),
            c = col_character()
            )) %>%
          mutate(filename = str_remove(file, "\\..*")) %>%
          filter(!str_detect(c, 'a'))
        })

В ОП for l oop data %>% bind_rows не требуется, поскольку мы уже rbind используем 'tmp_data` в каждой итерации

data <- data.frame()
for (file in files){

  name = strsplit(file, split = "\\.")[[1]][1]

  tmp <- read_delim(file = file, delim = ";", col_types = cols(
    a = col_double(),
    b = col_double(),
    c = col_character()
    )) %>% mutate(filename = name)
    tmp_data <- tmp %>%
      filter(!str_detect(c, 'a'))
    data <- rbind(data, tmp_data)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...