2016-01-21 1 views
0

Как слить 100 csv файлов в 1 набор данных? Строки и номер столбца различны.Как слить 100 csv файлов в 1 набор данных в R? Строки и номер столбца различны

У меня есть много файлов csv. Каждый файл имеет разные столбцы и строки. Я пробовал много способов слияния, но я терпеть неудачу, как показано ниже. Не могли бы вы дать мне совет?

1St TRY.

files=list.files(pattern=".csv$") 
files 
mydata1=lapply(files, function(x) read.csv(x, stringsAsFactors = FALSE)) 

mydata2 <- function(x) { 

x.diff <- setdiff(colnames(x), colnames(y)) 
y.diff <- setdiff(colnames(y), colnames(x)) 

x[, c(as.character(y.diff))] <- NA 

y[, c(as.character(x.diff))] <- NA 

return(mydata2) 
} 

merdata= merge(lapply(files, function(x) read.csv(x, stringsAsFactors = FALSE)), files, by=c("location","yearmon", "MME"), all=T) 

# Ошибка в data.frame (список (yearmon = с ("1983-01", "1983-02", "1983-03",: аргументы подразумевают различающиеся число строк: 278 , 398

#

у меня есть 1253 CSV-файлы. Я хочу, чтобы эти файлы в один набор данных. же имя столбца каждого файла должно совпадать с именем, а не «x.column», как это Я приложил образец файла результатов. Вы можете легко понять, что я хочу сделать. Я покажу вам два примера файлов как рев. "dput (mydata1 [1: 2])" данные кодирования, приведенные ниже. Конечной целью является объединение 1253 файлов в один набор данных. Еще раз спасибо за вашу помощь.

.names = с ("yearmon", "E01", "E02", "E03", "E04", "E05", "E06", "E07", "E08", " «E10», «E10», «E11», «E12», «E13», «E14», «E15», «E16», «E17», «E18», «E19», «E20», «MME », "расположение"), класс = "data.frame", row.names = с (NA, -398L)),

.names = с ("yearmon", "E01", "E02" , «E03», «E04», «E05», «E06», «E07», «E08», «E09», «E10», «MME», «location»), class = "data.frame" , row.names = c (NA, -278L )))

#

Sample Result iefile_1 [iefile_2]

+0

Храните все файлы в формате CSV как список - вывод lapply части кода, а затем использовать сливать в цикле. – zx8754

+1

Возможно, слияние - это не то, что вам действительно нужно. Это приведет к получению итогового 'data.frame' с тысячами столбцов, если он завершится успешно, что совсем не удобно для работы. Кроме того, я сомневаюсь, что он будет работать здесь: ваши 'data.frame' имеют общие столбцы (например, 'E01' и' E02'), которые содержат разные числа (не являются общими) и 'merge', что на самом деле делает' INNER JOIN 'будет производить пустую таблицу. Я предлагаю вам сначала изменить ваши таблицы в 'mydata1' на 5-столбцовое представление (смотрите функцию' gather' из пакета 'tidyr'), а затем привяжите их вместе с' bind_rows' от 'dplyr' – inscaven

+0

Спасибо за ваш добрый ответ. На самом деле, я только начал изучать R в эти дни.Мне, возможно, придется много учиться. В этот момент я не могу следовать твоему совету из-за моего короткого понимания. Извини за это. Если вы не возражаете, можете ли вы попробовать, как это сделать? Позвольте мне предоставить вам файлы данных. Благодарю. –

ответ

0

Попробуйте что-то вроде этого:

install.packages(c("dplyr", "tidyr"), dependencies = T) 
require("dplyr") 
require("tidyr") 

files <- list.files(pattern=".csv$") 
mydata1 <- lapply(files, function(x) read.csv(x, stringsAsFactors = FALSE)) 

mydata2 <- lapply(mydata1, function(df) { 
    df %>% gather(e_num, e_value, -yearmon, -MME, -location) 
}) %>% bind_rows 
+0

Большое вам спасибо. Вы оказали мне большую помощь. –

0

Поскольку наборы данных одни и те же столбцы, вы могли бы основывать свой подход на строки связываются rbind(). rbind() - это функция, которая объединяет векторы, матрицы или кадры данных по строкам. Вы должны создать список своих наборов данных и передать им функцию.

rbind(dt1,dt2,.., dtn) 

dt1.csv: 

Lett Color Num 
A  w  0.4 
A  b  -0.6 
B  b  1.2 
C  w  -0.70 

dt2.csv: 

Lett Color Num 
D  w  2.89 
D  b  0.06 
D  b  0.62 
D  w  0.5 
D  w  9.3 
B  w  -2.3 
A  b  -0.1 

Читайте в данных из файла:

> dt1 <- read.csv("dt1.csv", header=T, sep=",") 
> dt2 <- read.csv("dt2.csv", header=T, sep=",") 

> dt_merged <- rbind(dt1, dt2) 
> dt_merged 

Lett Color Num 
A  w  0.4 
A  b  -0.6 
B  b  1.2 
C  w  -0.70 
D  w  2.89 
D  b  0.06 
D  b  0.62 
D  w  0.5 
D  w  9.3 
B  w  -2.3 
A  b  -0.1 
Смежные вопросы