Соединение двух фреймов данных несколькими одинаковыми столбцами с сохранением непересекающихся данных в R - PullRequest
0 голосов
/ 28 сентября 2018

Я работал над циклом for, который будет автоматически извлекать данные из таблиц Excel (каждый файл Excel является одним наблюдением) и обобщать их в больший кадр данных.В конце концов я хотел бы создать фрейм данных, где каждая строка содержит сводные данные каждого журнала.Я написал код для точного суммирования файлов Excel, но столкнулся с проблемой при объединении строк, потому что фреймы сводных данных не содержат все одинаковые столбцы, поэтому я не могу использовать rbind.Ниже приведен пример формата, который я использовал для своих обобщенных листов Excel:

final <- data.frame("BCE_2_Dur" = c(92013), "BCE_2_Freq" = c(1), "BCD_1_Dur" = c(228804), "BCD_1_Freq"= c(7), "BSL_3_Dur" = c(100191), "BSL_3_Freq" = c(3))

Где каждое резюме Excel может иметь разные коды (поведения, которые мы видели у животных) вверху, которые соответствуют существующимполная этограмма, но не обязательно будет включать в себя поведение всей этограммы (если они не видны).

Поскольку это в цикле for, я пытался решить проблему, просто создав пустые данныефрейм, который выглядит следующим образом:

empty <- data.frame("BCE_1_Dur" = c(0), "BCE_1_Freq" = c(0), "BCE_2_Dur" = c(0), "BCE_2_Freq" = c(0), "BCE_3_Dur" = c(0), "BCE_3_Freq" = c(0), "BCD_1_Dur" = c(0), "BCD_1_Freq"= c(0),"BCD_2_Dur" = c(0), "BCD_2_Freq"= c(0),"BCD_3_Dur" = c(0), "BCD_3_Freq"= c(0),"BSL_1_Dur" = c(0), "BSL_1_Freq" = c(0),"BSL_2_Dur" = c(0), "BSL_2_Freq" = c(0),"BSL_3_Dur" = c(0), "BSL_3_Freq" = c(0))

И затем пытаюсь связать их вместе, используя left_join, так как я хочу сохранить все столбцы пустыми, но заполнить столбцами, которые в конечном итоге совпадают.Чтобы предоставить значения для аргумента «by» в left_join, я создаю список (опять же, это должно работать в цикле for, чтобы список менялся при каждом прохождении цикла) по именам столбцов final:

namesfinal<-names(final)
namesfinal<-paste("'",as.character(namesfinal),"'",collapse=", ",sep="")
namesfinal<-paste("c","(",namesfinal,")",sep="")

Затем я запускаю список в код left_join:

Sum_Final <- left_join(x = empty, y = final, by = namesfinal)

Это выдает ошибку: Ошибка: by не может содержать столбец соединения c('BCE_2_Dur', 'BCE_2_Freq', 'BCD_1_Dur', 'BCD_1_Freq', 'BSL_3_Dur', 'BSL_3_Freq'), который отсутствует в LHS

Мое намерение состояло в том, чтобы затем rbind () Sum_Final к себе в конце цикла.однако, я не могу пройти мимо ошибки.Я попытался найти его и запустить разные версии имен через код (например, 'BCE_2_Dur' = 'BCE_2_Dur'), ​​но получил те же ошибки.У кого-нибудь есть исправление и / или другое решение, которое может работать в цикле for?

1 Ответ

0 голосов
/ 28 сентября 2018

Вам не нужен цикл for или объединение.Вы можете сделать это, используя lapply и plyr::rbind.fill() -

filenames <- list.files("path to folder with all files", pattern="*.csv", full.names=TRUE)
ldf <- lapply(filenames, read.csv)
final_df <- plyr::rbind.fill(ldf)

rbind.fill, чтобы связать все кадры данных и заполнить несоответствующие столбцы с помощью NA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...