【问题标题】:Apply a match function to add a column to a list of named dataframes应用匹配函数将列添加到命名数据框列表
【发布时间】:2020-04-17 19:11:09
【问题描述】:

我正在尝试根据每个数据框的名称将变量列添加到数据框列表中。

这里的想法是每个数据框代表特定分析物的特定测试结果。测试结果是数字的,但是我的分析仪会给我低于它能够可靠读取的数字(检测限;LOD),这在我的数据中造成混乱的废话。我想过滤掉小于 LOD 的结果,但是每个分析物(列表中的数据框)都有不同的 LOD。这是一个可重现的示例:

#A list of two dataframes representing analytes called "A" and "C" with results from 2 analyzers (X and Y)
df.list <- list(A=data.frame(id=c("P1", "P2", "P3", "P4"), X1=c(1,2,5, 3), Y1=c(4,5,8,6)),
                C=data.frame(id=c("P1", "P2", "P3", "P4"),  X1=c(4,NA,6, 7), Y1=c(4,NA,7,6)))


#A third dataframe (not in the list) containing the identity and LoD of each analyte
lod.input <- data.frame(Analyte = c("A","C"), LoD = c(1,10))

现在我要做的是将lod.input 数据帧列表中的“分析物”列中的变量与names(df.list) 标识匹配,并在具有LOD 的数据帧lod.input 列表中输出一列与该分析物相关。

到目前为止,我可以输入一个新列,列出来自列表中的一个数据框的 LOD

junk <- lapply(df.list, function(x) data.frame(x, LOD = lod.input$LoD[match(names(df.list[2]), lod.input$Analyte)]))
junk
   $A
      id X Y LOD
    1 P1 1 4  10
    2 P2 2 5  10
    3 P3 5 8  10
    4 P4 3 6  10

    $C
      id  X  Y LOD
    1 P1  4  4  10
    2 P2 NA NA  10
    3 P3  6  7  10
    4 P4  7  6  10

但我似乎无法弄清楚如何匹配它们或合并更多 LOD。

junk <- lapply(df.list, function(x) data.frame(x, LOD = lod.input$LoD[match(names(x[1]), lod.input$Analyte)]))
junk

$A
  id X Y LOD
1 P1 1 4  NA
2 P2 2 5  NA
3 P3 5 8  NA
4 P4 3 6  NA

$C
  id  X  Y LOD
1 P1  4  4  NA
2 P2 NA NA  NA
3 P3  6  7  NA
4 P4  7  6  NA

我想我可能需要一个嵌套的 lapply 函数,但我似乎无法弄清楚。帮助表示赞赏!

【问题讨论】:

  • 如果你想通过管道传输数据,我建议使用 purrr::map(~ function(x))

标签: r


【解决方案1】:

根据你所拥有的,你可以遍历data.frame的名称:

lapply(names(df.list),function(i){
cbind(df.list[[i]],LOD=lod.input$LoD[match(i,lod.input$Analyte)])
})

正如@42- 指出的(参见下面的 cmets),您上面的内容不起作用,因为当您通过列表(或任何命名向量)时,它不会将列表的名称传递给后续函数。

【讨论】:

  • 是的,这更准确。我在答案中进行了编辑。感谢您指出@42-
【解决方案2】:

这对你的目的有用吗lapply(names(df.list), function(n) cbind(df.list[[n]], LOD=lod.input[lod.input$Analyte == n,]$LoD))

【讨论】:

  • 是的,这也有效。我必须将其应用于我的实际数据集,看看性能是否有很大差异
猜你喜欢
  • 1970-01-01
  • 2016-08-26
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2012-04-11
相关资源
最近更新 更多