尝试将合并应用于文件列表,但将其解释为字符串列表

时间:2016-08-15 19:35:03

标签: r

我试图传入文件名列表并合并相应的数据帧。我通过读取目录中的所有文件来构建文件名列表。我的问题不在于合并数据帧,而是数据帧列表被解释为字符串。

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文件的整个目录上进行此合并?现在它们被解释为字符串。

1 个答案:

答案 0 :(得分:1)

以递归方式将mergejoin函数应用于列表更容易。首先将目录中的文件读入列表。

 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))))