【问题标题】:apply merge to a list of data.frames将合并应用于 data.frames 列表
【发布时间】:2013-06-13 22:45:11
【问题描述】:

我有一个 data.frames 列表,其中只有一列和一个 character 值:

> list.df[c(1,5,8)]
$1
     X..1L..
1      A
2      B
3      C
4      D
5      E
6      F
7      G
8      H

$5
   X..5L..
1    A
2    C
3    D
4    F
5    G

$8
   X..8L..
1   A
2   D
3   F
4   G
5   H
6   I

还有另一个data.frame

> df
  V2  V5      V9
1  A  31 0.13029
2  B  80 0.29443
3  C 166 0.01354
4  D  11 0.39589
5  E  62 0.61794
6  F  40 0.35808
7  G  31 0.62581
8  H  54 0.24983
9  I  19 0.47199
10 J  97 0.26518

我想将列表中的每个 data.frame 与df 合并,我尝试创建一个函数 func <- function(x,y){merge(x, y, by.x=x[,1], by.y=y[,1])} 然后将其应用于列表但它不起作用。

lapply(list.df, func, list.df, df)

我知道我可以将list.df 拆分为几个data.frames,然后将merge 分别拆分为每个,但我想知道list 中是否有办法做到这一点

谢谢

【问题讨论】:

    标签: r merge


    【解决方案1】:

    你有两个错误。一个在你的函数中,另一个在你如何调用你的函数:

    func <- function(x,y){merge(x, y, by.x=names(x)[1], by.y=names(y)[1])}
    lapply(list.df, func, df)
    

    【讨论】:

    • 您好@eddi,当列表有 9,000 个元素并且 data.frame 维度是 17,000 行 x 1000 列时,有什么方法可以加快函数fun?非常感谢
    • 使用 data.tables 而不是 data.frames - 在 SO 或 google 上快速搜索会让你开始,类似于 dt = data.table(df, key = 'V2') 的内容,然后使用 fn = function(x){df[x]}; lapply(list.df, func) 可能是一个不错的选择起点
    【解决方案2】:

    不太确定这是否有帮助,但也许可以尝试合并列表

    df.list <- do.call(merge,list.df[c(1,5,8)])
    

    但我要注意的一件事是,从外观上看,您的数据框列没有名称...在合并之前尝试命名列,这应该会有所帮助...

    colnames(df) <- c("col1","col2","col3")
    

    【讨论】:

    • as.data.frame(x) 中的错误:缺少参数“x”,当我添加 df.list &lt;- do.call(merge, list.df, df) if (quote) args
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2021-10-19
    • 2011-06-19
    • 2011-12-26
    • 2019-03-02
    相关资源
    最近更新 更多