Analyze Data Frames In A List And Bind The Results

◇◆丶佛笑我妖孽 提交于 2019-12-07 17:24:43

问题


The data I have is a list of data frames. I want to loop through each of the data frame to find:

  1. If there are columns with duplicate column names. If yes, then I want to merge them by using rbind() in a parent data frame called output and remove all other columns of such data frames.
  2. I also want to check if there is any data frame that doesn't have duplicate columns. If yes, then remove all the columns except the first one. Then cbind() with output such that if rows are more or less than what was created by (1) then zero should be added.

I tried using lappy(), but my logic to get above two isn't working at one go. Any suggestion will help.

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

})

Input Data List Containing Data Frames

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

Desired Output

> 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

回答1:


Loop through the list, create a condition with if/else that checks the length of the unique column names and returns the unlisted single data.frame when there is only a single unique column or else return the first column. Finally, with cbind.fill (from rowr) bind the list of data.frame columns together, specifying the fill as 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


来源:https://stackoverflow.com/questions/54562588/analyze-data-frames-in-a-list-and-bind-the-results

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!