如何合并不同列表中的数据名,包括基于名称的部分匹配,没有一对一的等效项

问题描述 投票:0回答:1

我有两个数据帧列表,需要根据两个列表中的匹配名称进行合并。 数据如下:

data <- list(foo = structure(list(bodyPart = c("leg", "arm", "knee", "eye"), side = c("LEFT", "RIGHT", "LEFT", "LEFT"), device = c("LLI", "LSM", "GHT", "LLM"), length = c(12, 476, 7, 2), id = c("AA", "BB", "CC", "NN"), mwID = c("a12", "k87", "j98", NA)), class = "data.frame", row.names = c(NA, -4L)), bar = structure(list(bodyPart = c("ankel", "ear", "knee", "ARM"), side = c("LEFT", "LEFT", "LEFT", "RIGHT"), device = c("GOM", "LSM", "YYY", "RWS"), id = c("ZZ", "DD", "FF", "DC"), tqID = c("kj8", "ll23", "sc26",  "fg12")), class = "data.frame", row.names = c(NA, -4L)))

这是我要合并到数据中的列表:

sub <- list(foo.new = structure(list("Duo:length" = c(23, 54, 77), id = c("AA", "BB", "CC")), class = "data.frame", row.names = c(NA, -3L)), bar.excel.km = structure(list("Duo:side" = c("LEFT", "RIGHT", "LEFT"), id = c("ZZ", "DD", "FF")), class = "data.frame", row.names = c(NA, -3L)))

这是所需的输出:

我使用了下面的代码,但问题是我无法指定“子”表中以“foo”开头的所有数据帧应合并到数据中的“foo”表中。

Map(merge, data, sub, by='id', all=TRUE)
r dictionary merge mapply
1个回答
0
投票

对于这样的模式匹配,为了简单起见,我建议使用双

for
循环。

for (nm1 in names(data)) {
  for (nm2 in grep(nm1, names(sub), value=TRUE)) {
    data[[nm1]] <- merge(data[[nm1]], sub[[nm2]], by = "id", all = TRUE)
  }    
}
data
# $foo
#   id bodyPart  side device length mwID Duo:length
# 1 AA      leg  LEFT    LLI     12  a12         23
# 2 BB      arm RIGHT    LSM    476  k87         54
# 3 CC     knee  LEFT    GHT      7  j98         77
# 4 NN      eye  LEFT    LLM      2 <NA>         NA
# $bar
#   id bodyPart  side device tqID Duo:side
# 1 DC      ARM RIGHT    RWS fg12     <NA>
# 2 DD      ear  LEFT    LSM ll23    RIGHT
# 3 FF     knee  LEFT    YYY sc26     LEFT
# 4 ZZ    ankel  LEFT    GOM  kj8     LEFT

备注:

  1. 我修复了原始
    data$foo
    中的问题,使其不是损坏的框架。请参阅下文了解此处使用的数据。
  2. 您的
    output$foo
    包括
    Duo:bodyPart
    ,但不清楚该数据的来源,我暂时跳过了它。

数据

data <- list(foo = structure(list(bodyPart = c("leg", "arm", "knee", "eye"), side = c("LEFT", "RIGHT", "LEFT", "LEFT"), device = c("LLI", "LSM", "GHT", "LLM"), length = c(12, 476, 7, 2), id = c("AA", "BB", "CC", "NN"), mwID = c("a12", "k87", "j98", NA)), class = "data.frame", row.names = c(NA, -4L)), bar = structure(list(bodyPart = c("ankel", "ear", "knee", "ARM"), side = c("LEFT", "LEFT", "LEFT", "RIGHT"), device = c("GOM", "LSM", "YYY", "RWS"), id = c("ZZ", "DD", "FF", "DC"), tqID = c("kj8", "ll23", "sc26",  "fg12")), class = "data.frame", row.names = c(NA, -4L)))
sub <- list(foo.new = structure(list("Duo:length" = c(23, 54, 77), id = c("AA", "BB", "CC")), class = "data.frame", row.names = c(NA, -3L)), bar.excel.km = structure(list("Duo:side" = c("LEFT", "RIGHT", "LEFT"), id = c("ZZ", "DD", "FF")), class = "data.frame", row.names = c(NA, -3L)))
© www.soinside.com 2019 - 2024. All rights reserved.