【问题标题】:Merge elements of dataframe in list based on partial match of names根据名称的部分匹配合并列表中数据框的元素
【发布时间】:2018-02-03 21:40:14
【问题描述】:

我有一个清单:

lst <- list(a1=dfa1, a2=dfa2, b1=dfb1, b2=dfb2)

dfa1 <- data.frame(x=c(1:5), y=c(2, 5, 7, 9, 10))
dfa2 <- data.frame(x=c(1:6), y=c(3, 8, 1, 2, 4, 13))
dfb1 <- data.frame(x=c(1:4), y=c(7, 9, 3, 2))
dfb2 <- data.frame(x=c(1:7), y=c(9, 3, 5, 1, 7, 9, 11))

基于部分元素匹配'a'和'b',我希望列绑定dataframem,新列表应如下所示:

new_list
$a
  x  y1 y2
1 1  2  3
2 2  5  8
3 3  7  1
4 4  9  2
5 5 10  4

$b
  x y1 y2
1 1 7  9
2 2 9  3
3 3 3  5
4 4 2  1

【问题讨论】:

    标签: r list dataframe merge cbind


    【解决方案1】:

    这是一个带有lapplyReduce 的方法。 lapply 遍历字母“a”和“b”并将Reduce 应用于名称包含当前字母的列表元素。 Reducemerge 函数应用于两个 data.frames,由变量“x”合并,并在给定参数中添加所需的后缀。感谢zx8754的建议,我添加了seq_along(grep(let, names(lst))),让变量的最终名称可以增加组成员的数量。

    myList <- lapply(c("a", "b"), function(let)
                                  setNames(Reduce(function(x, y) merge(x, y, by="x"),
                                                  lst[grep(let, names(lst))]),
                                         c("x", paste0("y", seq_along(grep(let, names(lst)))))))
    [[1]]
      x y1 y2
    1 1  2  3
    2 2  5  8
    3 3  7  1
    4 4  9  2
    5 5 10  4
    
    [[2]]
      x y1 y2
    1 1  7  9
    2 2  9  3
    3 3  3  5
    4 4  2  1
    

    要将名称添加到列表中,以后再执行此操作可能是最简单的,

    names(myList) <- c("a", "b")
    

    你也可以从向量开始

    myVec

    然后在lapplynames 行中使用它。

    【讨论】:

    • 啊只是在输入答案。也许更好地将后缀与数据帧匹配列表的长度联系起来,在这种情况下,有 2 个带有“a”的 dfs,可能超过 2 个,有意义吗?
    • @lmo 谢谢!我实际上有四个以上(两个重复)的元素,因此如果新列表具有部分匹配部分的元素名称会更好。
    • 感谢@zx8754 的建议。添加了seq_along。对快速抽奖感到抱歉。
    • @lmo 感谢您的解决方案。添加元素名称的任何想法?然后我可以判断 [[1]] 是来自 a1+a2 还是 b1+b2。
    • @lmo,谢谢!问题是我的元素名称不按顺序排列,它不像:a1、a2、b1、b2;我的真实清单有20多个元素,有些是重复的,有些是一式三份的。很少:c1、a1、b1、b2、d1、b3、c2、a2、d2、d3。那么你认为之后添加名称可以区分它们吗?
    猜你喜欢
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多