包含行索引和列索引的数据帧列表,用于从较大的数据帧中选择数据

时间:2018-05-11 21:32:20

标签: r

我有一个数据框列表。其中一列包含数据框的名称:

a <- data.frame(PIN = c(1:3), Item = c("a", "a", "a"))
b <- data.frame(PIN = c(4:6), Item = c("b", "b", "b"))
List <- list(a, b)

我想从中提取更大的数据框。我的数据框列表中第一列中的值对应于第一列或更大数据框中的值,而我的数据框列表的第二列中的名称/值对应于较大数据框中的列名称:

DF <-data.frame(PIN = c(1:10), a = c(101:110), b = c(201:210), c = c(301:310))

我想在列表中的数据框中添加列,从DF中提取数据,使用PIN作为行索引,将Item作为列索引。基本上,我最终将会:

a <- data.frame(PIN = c(1:3), Item = c("a", "a", "a"), a = c(101:103))
b <- data.frame(PIN = c(4:6), Item = c("b", "b", "b"), b = c(204:206))
List <- list(a, b)

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可能需要重新考虑数据结构:

  1. 可以将一组结构相同的data.frames组合成一个更大的数据对象,避免迭代列表元素。
  2. 由于a的{​​有效负载'列bcDF都包含相同的数据类型,DF可以从广角重新整形长格式。这会将列名转换为可以更容易用于查找操作的数据元素。
  3. 所以,我的建议是:

    library(data.table)
    
    keys <- rbindlist(List, idcol = TRUE)
    DT <- setDT(melt(DF, id.vars = "PIN", variable.name = "Item"))
    DT[keys, on = .(PIN, Item)]
    
       PIN Item value .id
    1:   1    a   101   1
    2:   2    a   102   1
    3:   3    a   103   1
    4:   4    b   204   2
    5:   5    b   205   2
    6:   6    b   206   2
    

    如果您仍需要列表结果:

    split(DT[keys, on = .(PIN, Item)], by = ".id")
    
    $`1`
       PIN Item value .id
    1:   1    a   101   1
    2:   2    a   102   1
    3:   3    a   103   1
    
    $`2`
       PIN Item value .id
    1:   4    b   204   2
    2:   5    b   205   2
    3:   6    b   206   2