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

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

下面是所需的输出:

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

我使用了下面的代码,但问题是我不能指定"Sub"表中以"foo"开头的所有数据帧都应该合并到data中的"foo"表中.

Map(merge, data, sub, by='id', all=TRUE)

推荐答案

对于这样的模式匹配,为了简单起见,我建议使用双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

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

R相关问答推荐

编码变量a、b、c以匹配来自另一个数据点的变量x

R中具有gggplot 2的Likert图,具有不同的排名水平和显示百分比

R中的子集文件—读取文件名索引为4位数字序列,例如0001到4000,而不是1到4000)

隐藏e_mark_line的工具提示

如何将dygraph调用到R Markdown作为一个shiny 的react 对象的参数?

筛选出以特定顺序患病的个体

根据多个条件增加y轴高度以适应geom_text标签

当我们有多个特殊字符时,使用gsub删除名称和代码'

如何删除仅在数据集顶部和底部包含零的行

解析R函数中的变量时出现的问题

从服务器在Shiny中一起渲染图标和文本

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

减少雨云面之间的间距并绘制所有统计数据点

如何构建一个for循环来循环处理动物ID?

创建新列,其中S列的值取决于该行S值是否与其他行冗余

按组使用dummy r获取高于标准的行的平均值

将边列表转换为路径长度列表

通过匹配另一个表(查找表)中的列值来填充数据表,并在另一个变量上进行内插

R中从因数到数字的转换

修复标签重叠和ggploy内的空间