通过多个相似的列连接两个数据帧,同时在R中保持不重叠的数据

时间:2018-09-27 22:08:58

标签: r for-loop merge left-join

我一直在研究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将它们绑定在一起,因为我想将所有列都保留为空,但要使用与final匹配的列来填充。为了为left_join中的“ by”参数提供值,我创建了一个列表(同样,它必须在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不能包含LHS缺少的联接列c('BCE_2_Dur', 'BCE_2_Freq', 'BCD_1_Dur', 'BCD_1_Freq', 'BSL_3_Dur', 'BSL_3_Freq')

我的意图是在循环结束时将rbind()Sum_Final自身使用。但是,我无法克服错误。我尝试查找它并通过代码运行不同版本的namefinal(例如'BCE_2_Dur'='BCE_2_Dur'),但遇到相同的错误。是否有人有可能在for循环中工作的修复程序和/或其他解决方案?

1 个答案:

答案 0 :(得分:1)

您不需要for循环或联接。您可以使用lapplyplyr::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填充不匹配的列

相关问题