簡體   English   中英

如何根據條件在數據幀列表中行合並和刪除列

[英]How To Row Combine And Drop Columns In A List of Data Frames Based On Conditions

以下是示例數據,該數據是包含不同數據幀的列表。 我要根據以下兩個條件從中獲取一個數據幀。

第一:

  1. 對於列表開始列1中的每個數據幀,請保留rbind()列,這些列的名稱與上一個名稱完全相同。 當遇到不同的列名時,將其和所有列拖到最后一個。
  2. 例如:如果列1命名為Banana ,則列2命名為Banana ,但列3為Orange ,然后列4再次為Banana 然后,第1列和第2列將為rbind() ,第3列和第4列將被刪除。
  3. 另一個例子:如果第1列被命名為Banana ,然后第2列被命名為Orange ,但第3列被命名為Banana ,則僅列1將生存作為起始列2列名稱是不同的,我不關心列3名,即使與第1列相同。

第二:

  1. 通過上述條件運行數據幀列表之后,我想合並列表中的所有數據幀以獲得一個數據幀,我認為可以使用以下代碼來實現。
  2. 在此, lst2是第一條件的輸出。
do.call(rowr::cbind.fill, c(lst2, list(fill = 0)))

以上代碼歸功於@akrun 任何建議都會有所幫助。

樣本數據

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

更新1

@ØysteinS回答后,我意識到也應該有第三個條件:

第三:

  • 如果列表中的一個數據框中只有一列,則僅將該列添加到父數據框。

這應該做的工作:

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

# Use lapply to apply the same function to each data frame in the list.
combined_frames <- lapply(data, function(df){
  first_name <- names(df)[[1]]
  result <- df[, 1, drop = FALSE]
  # Keep adding if name is the same as the first
  if (ncol(df) != 1) {
   for(i in seq(2, length(names(df)), by = 1)){
     if(names(df)[[i]] == names(df)[[1]]){
       result <- rbind(result, df[, i, drop = FALSE])
     } else { 
       # Otherwise, break out of loop
       break
     }
   }
  }
  return(result)
})

# Yes, your suggested code seems to work as expected for the last task
do.call(rowr::cbind.fill, c(combined_frames, 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

一個簡單的選擇是遍歷list ,獲取列名稱的運行長度ID,僅提取等於1的列, unlist ,使用第一個列名稱轉換為data.frame ,然后使用cbind.fill綁定一起list data.frame

library(data.table)
lst1 <- lapply(data, function(x) 
       setNames(data.frame(unlist(x[rleid(names(x)) == 1])), names(x)[1]))
do.call(rowr::cbind.fill, c(lst1, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM