Друзья, Я получил следующий код для объединения нескольких CSV-файлов в определенную папку, человек, который помог мне попробовать этот код, для него работает хорошо... но когда я его использую, он не показывает какие-либо ошибки, но в выходных данных я получаю только заголовки, а не данные.

Подскажите пожалуйста как это побороть??? код будет выглядеть следующим образом,

setwd("C:/Users/dsuresh/Desktop/io")

multmerge = function(mypath){
  filenames=list.files(path=mypath, full.names=TRUE)
  datalist = lapply(filenames, function(x){read.csv(file=x,header=T)})
  Reduce(function(x,y) {merge(x,y)}, datalist)
}
mydata=multmerge("C:/Users/dsuresh/Desktop/io")
View(mydata)

Спасибо за потраченное время друзья...

r csv
0
eswari 24 Фев 2015 в 10:52
Koundy, спасибо за ваше время .. Я попытался заменить read.csv на read.table .... даже тогда он показывает только заголовки ... в основном мои заголовки - это имя и область 3d. раньше вывод был похож на row.names name area_3d, а теперь вывод был row.names, name.area_3d. не большая разница. как это побороть???
 – 
eswari
24 Фев 2015 в 11:06
1
Выполните базовую отладку. Проверьте содержимое filenames и datalist. Я согласен с @koundy, ваша проблема, вероятно, связана с шагом merge. Я подозреваю, что вам нужно указать столбцы by, которые должны быть объединены в data.frame.
 – 
Roland
24 Фев 2015 в 11:27
@Roland: спасибо за вашу огромную помощь .. на самом деле ваше предложение и предложение Koundy помогли мне преуспеть в объединении всех моих файлов csv на 98% идеально :). большое спасибо... но единственная проблема в том, что он не поддерживает порядок общего поля, на основе которого файлы должны быть объединены. другими словами, мое общее имя поля в файле и данные в этом столбце выглядят как A-2:1 A-2:2 A-2:3 A-2:4 A-2:5 ...... .... ......... A-2:232 A-2:233 A-2:234 B-1:1 B-1:2 B-1:3 B-1:4 B- 1:5 Б-1:6 Б-1:7 Б-1:8 ..... ........ Б-1:229 Б-1:230 Б-1:231 Б-1: 232 B-1:233 B-1:234 извините, я продолжу в следующем комментарии
 – 
eswari
24 Фев 2015 в 12:18
Так что я пробовал sort = False.. он работает в определенной степени.. но везде, где я получаю пропущенные значения, он идет по строке отдельно... но я не хочу этого... он должен поддерживать тот же порядок, что и в общем поле... пожалуйста, помогите мне с этим... также, пожалуйста, скажите мне, как получить имена файлов в заголовке, так как у меня есть дата в именах 100 файлов, мне нужно, чтобы они были включены заголовок, чтобы определить, какой файл какой????
 – 
eswari
24 Фев 2015 в 12:18
@Roland- можно ли как-нибудь прикрепить мой CSV-файл к этому форуму... чтобы вам было очень ясно, о чем я вас прошу????
 – 
eswari
24 Фев 2015 в 13:19

2 ответа

Я думаю, что ваш файл не является правильным .csv (файл значений, разделенных запятыми). попробуйте заменить функцию read.csv на read.table и проверьте. В противном случае с этой функцией проблем нет. Если она не работает, попробуйте использовать rbind вместо merge. функция слияния сопоставляет два столбца из данных, а затем объединяет. Если ваши данные не имеют одинаковых имен строк или столбцов, они не будут работать должным образом.

1
Koundy 24 Фев 2015 в 11:02
Я понял вашу точку зрения... мои CSV-файлы в основном одинаковы, и у меня есть общее поле с именем name во всех CSV-файлах. затем, если я использую rbind, я буду объединяться вниз справа. Я не хочу этого, я хочу объединять по горизонтали, как это делает этот cbind (но для cbind мне нужны одинаковые кадры данных, но мои не так, я не могу использовать) поэтому я надеюсь, что слияние - единственный вариант... но я не получаю правильного вывода... пожалуйста, помогите мне
 – 
eswari
24 Фев 2015 в 11:27
Если ваши фреймы данных не имеют одинаковых строк, я не знаю, как их объединить.
 – 
Koundy
24 Фев 2015 в 12:01
Спасибо за вашу большую помощь .. на самом деле ваше предложение и предложение @Roland помогли мне добиться успеха в объединении всех моих файлов csv на 98% идеально :). большое спасибо... но единственная проблема в том, что он не поддерживает порядок общего поля, на основе которого файлы должны быть объединены. другими словами, мое общее поле name в файле и данные в этом столбце выглядят как A-2:1 A-2:2 A-2:3 A-2:4 A-2: 5 .......... .......... ......... А-2:232 А-2:233 А-2:234 В-1:1 Б-1:2 Б-1:3 Б-1:4 Б-1:5 Б-1:6 Б-1:7 Б-1:8 ..... ........ Б- 1:229 B-1:230 B-1:231 B-1:232 B-1:233 B-1:234 извините, я продолжу в следующем комментарии
 – 
eswari
24 Фев 2015 в 12:13
Поэтому я пробовал sort = False... в определенной степени это работает... но везде, где я получаю пропущенные значения, они идут по строке отдельно... но я не хочу этого. ... он должен поддерживать тот же порядок, что и общее поле ... пожалуйста, помогите мне с этим ... также, пожалуйста, скажите мне, как получить имена файлов в заголовке, так как у меня есть дата в именах 100 файлов , мне нужно, чтобы они были в заголовке, чтобы определить, какой файл какой????
 – 
eswari
24 Фев 2015 в 12:17
Я не знаю о таких проблемах, я бы посоветовал вам задать другой вопрос в stackoverflow, чтобы кто-то другой вам ответил.
 – 
Koundy
24 Фев 2015 в 12:20

rbind отлично работает в вашем случае.

csvFile1 = "col1,col2,col3\na1,a2,a3\nb1,b2,b3"
csvFile2 = "col1,col2,col3\nc1,c2,c3\nd1,d2,d3"
csvFile3 = "col1,col2,col3\ne1,e2,e3\nf1,f2,f3"
con1 = textConnection(csvFile1)
con2 = textConnection(csvFile2)
con3 = textConnection(csvFile3)
csvList = list(con1, con2, con3)

multmerge = function(files){
  datalist = lapply(files, read.csv)
  Reduce(rbind, datalist)
}

mydata=multmerge(csvList)
View(mydata)

Более того, вы могли бы сделать просто do.call(rbind, datalist) вместо Reduce И вам не нужно указывать header=T в read.csv - это опция по умолчанию.

0
Roman Degtiarev 24 Фев 2015 в 11:45