我试图传入文件名列表并合并相应的数据帧。我通过读取目录中的所有文件来构建文件名列表。我的问题不在于合并数据帧,而是数据帧列表被解释为字符串。
temp.table <- merge(all.data.frames[1], all.data.frames[2], by = "hostname", all = TRUE)
Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column
这是我的代码,它读取目录以列出所有数据框,并且我试图将它们全部合并到一个公共变量上:
setwd("C:/temp")
all.files <- ls()
all.data.frames <- all.files[sapply(all.files, function(x) is.data.frame(get(x)))]
这使得列表等同于:
c("data.frame1.dt", "data.frame2.dt", "data.frame3.dt", ...)
以下是一些测试数据:
data.frame1.dt <- data.frame("hostname" = c("a", "b", "c"), "username" = c("dkfj", "adfkjds", "adklfh"), "tele" = c(12,43,56))
data.frame2.dt <- data.frame("hostname" = c("d", "b", "q"), "username" = c("dkfjdfs", "adfdtkjds", "adasdklfh"), "scan" = c(132,403,546))
data.frame3.dt <- data.frame("hostname" = c("a", "q", "x", "Ip1"), "timer" = c("Log1", "Log3", "Log5", "LAG"), "cpu" = c("1343232-a","4354342-03", "5dfasd46", "Nothing"))
数据的合并如下:
xx <- merge(data.frame1.dt, data.frame2.dt, by = "hostname", all = TRUE)
total.join <- merge(xx, data.frame3.dt, by = "hostname", all = TRUE)
给出结果:
hostname username.x tele username.y scan timer cpu
1 a dkfj 12 <NA> <NA> Log1 1343232-a
2 b adfkjds 43 adfdtkjds 403 <NA> <NA>
3 c adklfh 56 <NA> <NA> <NA> <NA>
4 d <NA> <NA> dkfjdfs 132 <NA> <NA>
5 q <NA> <NA> adasdklfh 546 Log3 4354342-03
6 Ip1 <NA> <NA> <NA> <NA> LAG Nothing
7 x <NA> <NA> <NA> <NA> Log5 5dfasd46
如何在data.frame文件的整个目录上进行此合并?现在它们被解释为字符串。
答案 0 :(得分:1)
以递归方式将merge
或join
函数应用于列表更容易。首先将目录中的文件读入列表。
filenames <- list.files(path = ".", pattern="*.csv", full.names=TRUE)
list_of_df <- lapply(filenames, read.csv)
然后调用数据框列表中的join
函数。
do.call("join", list_of_df)
关于一些样本数据
do.call("join",list(data.frame(hostname = 1:10, x = rnorm(10)),
data.frame(hostname = 8:12, y = rnorm(5))))