Объединение мультифайлов и добавление уникального идентификатора для каждого из них. - PullRequest
0 голосов
/ 23 ноября 2018

Я новичок в R. У меня возникла проблема при объединении данных, надеюсь, что кто-нибудь поможет решить ее.Предположим, что у меня есть два CSV-файла, такие как A.csv и B.csv, расположенные по пути «C: \ Users \ Public \ A».Они выглядят так:

A.csv

T,2015,2016,2017,2018 X1,1,2,3,2 X2,1,2,2,3 X3,1,3,4,2

B.csv

T,2015,2016,2017 X1,2,4,3 X2,2,2,3 X3,3,3,4

И тогда япопытаться объединить их, а также транспонировать их с помощью следующих функций.Они созданы Рикардо Оливерос-Рамосом в здесь и Тони Куксоном в здесь .1. Во-первых, я создаю функцию read.tcsv для чтения и транспонирования данных в файл CSV

  read.tcsv = function(file, header=TRUE, sep=",", ...) {
  n = max(count.fields(file, sep=sep), na.rm=TRUE)
  x = readLines(file)

  .splitvar = function(x, sep, n) {
    var = unlist(strsplit(x, split=sep))
    length(var) = n
    return(var)
  }

  x = do.call(cbind, lapply(x, .splitvar, sep=sep, n=n))
  x = apply(x, 1, paste, collapse=sep) 
  out = read.csv(text=x, sep=sep, header=header, ...)
  return(out)

}

2.Затем я использую multrbind.fill, чтобы объединить и заполнить пропущенное значение

multrbind.fill = function(mypath){
  filenames=list.files(path=mypath, full.names=TRUE)
  datalist = lapply(filenames, function(x){
    read.tcsv(file=x,header=T)
  }
)
    Reduce(function(x,y) {plyr::rbind.fill(x,y)}, datalist)
}
Результат выглядит хорошо:

ï..T X1 X2 X3 2015 1 1 1 2016 2 2 3 2017 3 2 4 2018 2 3 2 2015 2 2 3 2016 4 2 3 2017 3 3 4

Однако я хочу добавить столбец в качестве идентификатора для каждого файла со своим именем файла (или уникальными идентификаторами), например:

ï..T ID X1 X2 X3 2015 A 1 1 1 2016 A 2 2 3 2017 A 3 2 4 2018 A 2 3 2 2015 B 2 2 3 2016 B 4 2 3 2017 B 3 3 4

Кто-то мне поможет!?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Спасибо TJ83 за помощь в исправлении этой функции.Основываясь на комментариях TJ83 , я добавляю столбец идентификаторов с именем ID.И вот моя полная функция read.tcsv

read.tcsv = function(file, header=TRUE, sep=",", ...) {
  n = max(count.fields(file, sep=sep), na.rm=TRUE)
  x = readLines(file)

  .splitvar = function(x, sep, n) {
    var = unlist(strsplit(x, split=sep))
    length(var) = n
    return(var)
  }

  x = do.call(cbind, lapply(x, .splitvar, sep=sep, n=n))
  x = apply(x, 1, paste, collapse=sep)

out = read.csv(text=x, sep=sep, header=header, ...)
out$ID<-tools::file_path_sans_ext(basename(file))
return(out)

} 
0 голосов
/ 23 ноября 2018

1) Если у вас есть только 2 набора данных, то самым быстрым способом было бы добавить ID-столбец в наборы данных A и B после преобразования, но до привязки строк.

Dataset_A$ID<-"A"
Dataset_B$ID<-"B"
# Where Dataset_X is the name of your imported transformed datasets.

2) Не могли бы выпоказать свой точный код?Если у вас есть только 2 набора данных, я думаю, что созданный вами код может быть существенно упрощен.Если вы заинтересованы в упрощении, то, пожалуйста, предоставьте нам вывод из 2 приведенных ниже операторов dput:

A<-read.csv("A-dataset")
B<-read.csv("B-dataset")
dput(A)
dput(B)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...