Как добавлять каждый год из отдельных отдельных файлов в новый набор данных слияния - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть 5 файлов данных, и каждое имя файла - xxx2014.dat, xxx2015.dat ... xxx2018.dat.Я объединяю эти файлы вместе.

Теперь я хочу добавлять каждый год назад в свой новый набор данных слияния, как я могу сделать это в r?

Я пытаюсь использовать append (), но японятия не имею, как можно узнать, какая строка 2014 или 2015 ...

yearslist = c("2014","2015","2016","2017","2018")

for (year in yearslist) {
    filename = paste0("xxx", year, ".dat")
    dataname <- assign(
        paste0("xxx", year),
        read_fwf(
            file = filename,
            fwf_positions(...),
            col_names = c("relationship","age","race","sex")
        )
    )
}
newmergedata <- bind_rows(fileA,fileB)

Я ожидал получить свой новый набор данных слияния, в котором один столбец соответствует годам.

For example:
Year     Sex     Region
2014     001       1
2014     002       1
2015     001       2
2018     002       1

However, now I only have 
Sex     Region
001       1
002       1
001       2
002       1 

Какнайти значение соответствующего года в новых данных слияния?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Функция rbindlist() имеет параметр idcol, который

Создает в результате столбец, показывающий, из какого элемента списка были получены эти строки.[...] Если у входного списка есть имена, эти имена являются значениями, помещенными в этот столбец идентификатора, [...]

(из help("rbindlist", "data.table"))

Так, возможно, вы можете попробовать что-то вроде следующего:

library(data.table)
library(magrittr) 
library(readr)

years <- 2014:2018
filenames <- sprintf("xxx%i.dat", years)
newmergedata <- lapply(
  filenames, 
  read_fwf, 
  col_positions = fwf_positions(...),
  col_names = c("relationship","age","race","sex")
) %>% 
  set_names(years) %>% 
  rbindlist(idcol = "Year")

Обратите внимание, что код не проверен из-за отсутствия воспроизводимого примера и может потребовать внесения изменений в ваши конкретные наборы данных.

0 голосов
/ 20 сентября 2019

Вот что я использовал:

files <- Sys.glob("*.dat") # assuming it's all your dat files, but this is easily modified otherwise

result <- do.call(rbind, lapply(files, function(x) {
    year <- sub("x+([0-9]+).*", "\\1", x)
    df <- read_fwf(
        file = x,
        fwf_positions(...),
        col_names = c("relationship","age","race","sex")
    )
    df$year <- year
    return(df)
}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...