2013-06-27 2 views
1

Используя определенную функцию, я хочу объединить пары кадров данных для множественных пар в каталоге R. Я пытаюсь написать цикл «for», который будет выполнять эту работу для меня, и, хотя связанные вопросы, такие как Merge several data.frames into one data.frame with a loop, полезны, я изо всех сил пытаюсь адаптировать примеры циклов для этого конкретного использования.Использование для циклов для соответствия парам кадров данных в R

Мои кадры данных заканчиваются либо «_df1.csv», либо « _df2.csv». Каждая пара, которую я хочу объединить в выходной кадр данных, имеет идентичное число при существовании имени файла (т. Е. 543_df1.csv и 543_df2.csv).

Я создал строку символов для каждого из двух типов файлов в моем каталоге с помощью list.files команды, как показано ниже:

df1files <- list.files(path="~/Desktop/combined files” pattern="*_df1.csv", full.names=T, recursive=FALSE) 
df2files <- list.files(path="="~/Desktop/combined files ", pattern="*_df2.csv", full.names=T, recursive=FALSE) 

Функции и команды, которые я хочу применить для того, чтобы объединить каждая пара кадров данных следующим образом:

findRow <- function(dt, df) { min(which(df$datetime > dt)) } 
rows <- sapply(df2$datetime, findRow, df=df1) 
merged <- cbind(df2, df1[rows,]) 

Я теперь пытаюсь включить эти команды в течение цикла, начиная с чем-то по следующим направлениям, чтобы предотвратить меня от необходимости вручную объединить пары:

for(i in 1:length(df2files)){ …… 

Я еще не сильный программист R, и ударил стену, поэтому любая помощь будет принята с благодарностью.

ответ

1

Моя интуиция (что у меня не было возможности проверить), что вы должны быть в состоянии сделать что-то вроде следующего:

# read in the data as two lists of dataframes: 
dfs1 <- lapply(df1files, read.csv) 
dfs2 <- lapply(df2files, read.csv) 

# define your merge commands as a function 
merge2 <- function(df1, df2){ 
    findRow <- function(dt, df) { min(which(df$datetime > dt)) } 
    rows <- sapply(df2$datetime, findRow, df=df1) 
    merged <- cbind(df2, df1[rows,]) 
} 

# apply that merge command to the list of lists 
mergeddfs <- mapply(merge2, dfs1, dfs2, SIMPLIFY=FALSE) 

# write results to files 
outfilenames <- gsub("df1","merged",df1files) 
mapply(function(x,y) write.csv(x,y), mergeddfs, outfilenames) 
+0

спасибо за выше. dfs создает двухэлементную матрицу списка с df1 и df2, но команда lapply (dfs, merge2) предполагает, что аргумент df2 отсутствует. Появилось следующее сообщение об ошибке: Ошибка в lapply (X = X, FUN = FUN, ...): отсутствует аргумент «df2», без значения по умолчанию. Любая идея, как это решить? – Emily

+0

и как бы сохранить полученные объединенные кадры данных из моей матрицы списка в виде файлов csv с помощью команды write.csv (data, dataname.csv) в кодировке? – Emily

+0

спасибо, но единственным способом, которым я мог создать два списка фреймов данных, было преобразование вашего кода в следующее: 'lapply (df1files, function (x) read.csv)'. Затем это сработало, но команда mapply все еще не дала мне правильно объединенных наборов данных, то есть все ячейки из df1 теперь читают «NA», и я получаю большой номер. предупреждений! – Emily