【问题标题】:Analyze Data Frames In A List And Bind The Results分析列表中的数据框并绑定结果
【发布时间】:2019-06-30 22:26:47
【问题描述】:

我拥有的数据是数据框列表。我想遍历每个数据框来查找:

  1. 如果存在列名重复的列。如果是,那么我 想通过在父数据框中使用rbind() 来合并它们 调用 output 并删除此类数据帧的所有其他列。
  2. 我还想检查是否有没有重复的数据框 列。如果是,则删除除第一列之外的所有列。然后 cbind()output 这样如果行大于或小于 由 (1) 创建,则应添加 zero

我尝试使用lappy(),但我达到两个以上的逻辑并不能一次奏效。任何建议都会有所帮助。

output <- lapply(data, function(x) {

})

包含数据框的输入数据列表

list(A = structure(list(`A-DIODE` = c(1.2, 0.4), `A-DIODE` = c(1.3, 
0.6)), row.names = c(NA, -2L), class = "data.frame"), B = structure(list(
    `B-DIODE` = c(1.4, 0.8), `B-ACC1` = c(1.5, 1), `B-ACC2` = c(1.6, 
    1.2), `B-ANA0` = c(1.7, 1.4), `B-ANA1` = c(1.8, 1.6), `B-BRICKID` = c(1.9, 
    1.8), `B-CC0` = c(2L, 2L), `B-CC1` = c(2.1, 2.2), `B-DIGDN` = c(2.2, 
    2.4), `B-DIGDP` = c(2.3, 2.6), `B-DN1` = c(2.4, 2.8), `B-DN2` = c(2.5, 
    3), `B-DP1` = c(2.6, 3.2), `B-DP2` = c(2.7, 3.4), `B-SCL` = c(2.8, 
    3.6), `B-SDA` = c(2.9, 3.8), `B-USB0DN` = 3:4, `B-USB0DP` = c(3.1, 
    4.2), `B-USB1DN` = c(3.2, 4.4), `B-USB1DP` = c(3.3, 4.6), 
    `B-ACC1` = c(3.4, 4.8), `B-ACC2` = c(3.5, 5), `B-ANA0` = c(3.6, 
    5.2), `B-ANA1` = c(3.7, 5.4), `B-BRICKID` = c(3.8, 5.6), 
    `B-CC0` = c(3.9, 5.8), `B-CC1` = c(4L, 6L), `B-DIGDN` = c(4.1, 
    6.2), `B-DIGDP` = c(4.2, 6.4), `B-DN1` = c(4.3, 6.6), `B-DN2` = c(4.4, 
    6.8), `B-DP1` = c(4.5, 7), `B-DP2` = c(4.6, 7.2), `B-SCL` = c(4.7, 
    7.4), `B-SDA` = c(4.8, 7.6), `B-USB0DN` = c(4.9, 7.8), `B-USB0DP` = c(5L, 
    8L), `B-USB1DN` = c(5.1, 8.2), `B-USB1DP` = c(5.2, 8.4), 
    `B-NA` = c(5.3, 8.6), `B-ACC2PWRLKG_0v4` = c(5.4, 8.8), `B-ACC2PWRLKG_0v4` = c(5.5, 
    9), `B-P_IN_Leak` = c(5.6, 9.2)), row.names = c(NA, -2L), class = "data.frame"))

期望的输出

> A
  A-DIODE
    1.2
    0.4
    1.3
    0.6

> B
  B-DIODE
    1.4 
    0.8

> Output
  A-DIODE B-DIODE
    1.2     1.4
    0.4     0.8
    1.3      0
    0.6      0

【问题讨论】:

    标签: r list dataframe data-analysis


    【解决方案1】:

    循环通过list,使用if/else 创建一个条件,检查unique 列名称的length 并在只有一个唯一列时返回unlisted 单个data.frame 或否则返回第一列。最后,使用cbind.fill(来自rowr)将data.frame 列的list 绑定在一起,将fill 指定为0

    lst2 <- lapply(lst1, function(x) if(length(unique(names(x))) ==1)
         setNames(data.frame(unlist(x)), names(x)[1]) else x[1])
    do.call(rowr::cbind.fill, c(lst2, list(fill = 0)))
    #    A.DIODE B.DIODE
    #1     1.2     1.4
    #2     0.4     0.8
    #3     1.3     0.0
    #4     0.6     0.0
    

    【讨论】:

    • 评论不用于扩展讨论;这个对话是moved to chat。请记住使用从讨论中收集到的任何见解来更新答案。
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2016-10-11
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多