簡體   English   中英

將兩個不同列表的數據幀融合到 r 中的一個數據幀列表中

[英]Melt dataframes of two different lists into one list of data frames in r

我有兩個數據框列表:list1 和 list2。 下面是來自 list1 (df1) 和 list2 (df2) 的示例數據框:

> print(df1)

         Moment.ext_multi.lane   Moment.ext_single.lane   Moment.int_multi.lane  Moment.int_single.lane
Baseline   0.7109148                  0.5367121               0.5874249               0.3718993
Sample1    0.7109148                  0.5367121               0.5874249               0.3718993
Sample2    0.7109148                  0.5367121               0.5874249               0.3718993
Sample3    0.7109148                  0.5367121               0.5874249               0.3718993
Sample4    0.7109148                  0.5367121               0.5874249               0.3718993
Sample5    0.7109148                  0.5367121               0.5874249               0.3718993
Sample6    0.7109148                  0.5367121               0.5874249               0.3718993
Sample7    0.7109148                  0.5367121               0.5874249               0.3718993
Sample8    0.7109148                  0.5367121               0.5874249               0.3718993
Sample9    0.7109148                  0.5367121               0.5874249               0.3718993
Sample10   0.7109148                  0.5367121               0.5874249               0.3718993
AASHTO     0.7550000                  NA                      0.6640000               0.4310000
Mean       0.7109148                  0.5367121               0.5874249               0.3718993

> print(df2)

         Shear.ext_multi.lane   Shear.ext_single.lane   Shear.int_multi.lane  Shear.int_single.lane
Baseline   0.7109148                  0.5367121               0.5874249               0.3718993
Sample1    0.7109148                  0.5367121               0.5874249               0.3718993
Sample2    0.7109148                  0.5367121               0.5874249               0.3718993
Sample3    0.7109148                  0.5367121               0.5874249               0.3718993
Sample4    0.7109148                  0.5367121               0.5874249               0.3718993
Sample5    0.7109148                  0.5367121               0.5874249               0.3718993
Sample6    0.7109148                  0.5367121               0.5874249               0.3718993
Sample7    0.7109148                  0.5367121               0.5874249               0.3718993
Sample8    0.7109148                  0.5367121               0.5874249               0.3718993
Sample9    0.7109148                  0.5367121               0.5874249               0.3718993
Sample10   0.7109148                  0.5367121               0.5874249               0.3718993
AASHTO     0.7550000                  NA                      0.6640000               0.4310000
Mean       0.7109148                  0.5367121               0.5874249               0.3718993

我想將這兩個列表合並到一個新的數據框列表中,並刪除所有 rown is all dataframes with the rownames that are called "Mean": list3.

然后我想融化列表的數據,使新列表中的數據框有 4 列。

第一列是Source,如果原件的rownames列出list1和list2是“Sample1”到“Sample10”,那么Source表示Sample,如果rowname是“baseline”則Source表示Baseline,如果行名是"AASHTO" 然后 Source 也表示 AASHTO。

第二列是 Type 並提取列名稱的末尾(從開頭刪除“Moment.”和“Shear.”,從末尾刪除“.lane”)。

第三列是 Moment,包括 list1 的值。

第四列是剪切,包括 list1 的值。

最終列表 list3 中的預期樣本數據框 (df3) 是:

> print(df2)
     Source        Type           Shear          Moment
1   Baseline     ext_multi      0.5367121      0.5874249
2   Baseline     ext_single     0.5367121      0.5874249    
3   Baseline     int_multi      0.5367121      0.5874249
4   Baseline     int_single     0.5367121      0.5874249
5   AASHTO       ext_multi      0.5367121      0.5874249
6   AASHTO       ext_single     0.5367121      0.5874249    
7   AASHTO       int_multi      0.5367121      0.5874249
8   AASHTO       int_single     0.5367121      0.5874249
9   AASHTO       int_single     0.5367121      0.5874249
5   Sample       ext_multi      0.5367121      0.5874249
6   Sample       ext_single     0.5367121      0.5874249    
7   Sample       int_multi      0.5367121      0.5874249
8   Sample       int_single     0.5367121      0.5874249
9   Sample       int_single     0.5367121      0.5874249
... continues 

我們可以使用pivot_longer將兩個list元素中的“長”格式重新pivot_longer ,然后使用map2循環遍歷兩個list的相應元素並進行連接

lst1new <-  map(lst1, ~
              .x %>% 
                 rownames_to_column("Source") %>% 
                 pivot_longer(cols = -Source, names_to = 'Type', 
                   values_to = 'Moment') %>% 
                 mutate(Type = str_replace(Type, '^\\w+\\.([^.]+)\\..*', '\\1')))

lst2new <-  map(lst2, ~
       .x %>% 
          rownames_to_column("Source") %>% 
          pivot_longer(cols = -Source, names_to = 'Type',
                values_to = 'Shear') %>%
          mutate(Type = str_replace(Type, '^\\w+\\.([^.]+)\\..*', '\\1')))

map2(lst1new, lst2new, full_join)
#[[1]]
# A tibble: 52 x 4
#   Source   Type       Moment Shear
# * <chr>    <chr>       <dbl> <dbl>
# 1 Baseline ext_multi   0.711 0.711
# 2 Baseline ext_single  0.537 0.537
# 3 Baseline int_multi   0.587 0.587
# 4 Baseline int_single  0.372 0.372
# 5 Sample1  ext_multi   0.711 0.711
# 6 Sample1  ext_single  0.537 0.537
# 7 Sample1  int_multi   0.587 0.587
# 8 Sample1  int_single  0.372 0.372
# 9 Sample2  ext_multi   0.711 0.711
#10 Sample2  ext_single  0.537 0.537
# … with 42 more rows

#[[2]]
# A tibble: 52 x 4
#   Source   Type       Moment Shear
# * <chr>    <chr>       <dbl> <dbl>
# 1 Baseline ext_multi   0.711 0.711
# 2 Baseline ext_single  0.537 0.537
# 3 Baseline int_multi   0.587 0.587
# 4 Baseline int_single  0.372 0.372
# 5 Sample1  ext_multi   0.711 0.711
# 6 Sample1  ext_single  0.537 0.537
# 7 Sample1  int_multi   0.587 0.587
# 8 Sample1  int_single  0.372 0.372
# 9 Sample2  ext_multi   0.711 0.711
#10 Sample2  ext_single  0.537 0.537
# … with 42 more rows

如果我們需要刪除“示例”中的數字

map2(lst1new, lst2new, ~ full_join(.x, .y) %>%
                         mutate(Source = str_remove(Source, "\\d+$")))

數據

lst1 <- list(structure(list(Moment.ext_multi.lane = c(0.7109148, 0.7109148, 
0.7109148, 0.7109148, 0.7109148, 0.7109148, 0.7109148, 0.7109148, 
0.7109148, 0.7109148, 0.7109148, 0.755, 0.7109148), Moment.ext_single.lane = c(0.5367121, 
0.5367121, 0.5367121, 0.5367121, 0.5367121, 0.5367121, 0.5367121, 
0.5367121, 0.5367121, 0.5367121, 0.5367121, NA, 0.5367121), Moment.int_multi.lane = c(0.5874249, 
0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.5874249, 
0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.664, 0.5874249), 
    Moment.int_single.lane = c(0.3718993, 0.3718993, 0.3718993, 
    0.3718993, 0.3718993, 0.3718993, 0.3718993, 0.3718993, 0.3718993, 
    0.3718993, 0.3718993, 0.431, 0.3718993)), class = "data.frame", row.names = c("Baseline", 
"Sample1", "Sample2", "Sample3", "Sample4", "Sample5", "Sample6", 
"Sample7", "Sample8", "Sample9", "Sample10", "AASHTO", "Mean"
)), structure(list(Moment.ext_multi.lane = c(0.7109148, 0.7109148, 
0.7109148, 0.7109148, 0.7109148, 0.7109148, 0.7109148, 0.7109148, 
0.7109148, 0.7109148, 0.7109148, 0.755, 0.7109148), Moment.ext_single.lane = c(0.5367121, 
0.5367121, 0.5367121, 0.5367121, 0.5367121, 0.5367121, 0.5367121, 
0.5367121, 0.5367121, 0.5367121, 0.5367121, NA, 0.5367121), Moment.int_multi.lane = c(0.5874249, 
0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.5874249, 
0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.664, 0.5874249), 
    Moment.int_single.lane = c(0.3718993, 0.3718993, 0.3718993, 
    0.3718993, 0.3718993, 0.3718993, 0.3718993, 0.3718993, 0.3718993, 
    0.3718993, 0.3718993, 0.431, 0.3718993)), class = "data.frame", row.names = c("Baseline", 
"Sample1", "Sample2", "Sample3", "Sample4", "Sample5", "Sample6", 
"Sample7", "Sample8", "Sample9", "Sample10", "AASHTO", "Mean"
)))

lst2 <- list(structure(list(Shear.ext_multi.lane = c(0.7109148, 0.7109148, 
0.7109148, 0.7109148, 0.7109148, 0.7109148, 0.7109148, 0.7109148, 
0.7109148, 0.7109148, 0.7109148, 0.755, 0.7109148), Shear.ext_single.lane = c(0.5367121, 
0.5367121, 0.5367121, 0.5367121, 0.5367121, 0.5367121, 0.5367121, 
0.5367121, 0.5367121, 0.5367121, 0.5367121, NA, 0.5367121), Shear.int_multi.lane = c(0.5874249, 
0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.5874249, 
0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.664, 0.5874249), 
    Shear.int_single.lane = c(0.3718993, 0.3718993, 0.3718993, 
    0.3718993, 0.3718993, 0.3718993, 0.3718993, 0.3718993, 0.3718993, 
    0.3718993, 0.3718993, 0.431, 0.3718993)), class = "data.frame", row.names = c("Baseline", 
"Sample1", "Sample2", "Sample3", "Sample4", "Sample5", "Sample6", 
"Sample7", "Sample8", "Sample9", "Sample10", "AASHTO", "Mean"
)), structure(list(Shear.ext_multi.lane = c(0.7109148, 0.7109148, 
0.7109148, 0.7109148, 0.7109148, 0.7109148, 0.7109148, 0.7109148, 
0.7109148, 0.7109148, 0.7109148, 0.755, 0.7109148), Shear.ext_single.lane = c(0.5367121, 
0.5367121, 0.5367121, 0.5367121, 0.5367121, 0.5367121, 0.5367121, 
0.5367121, 0.5367121, 0.5367121, 0.5367121, NA, 0.5367121), Shear.int_multi.lane = c(0.5874249, 
0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.5874249, 
0.5874249, 0.5874249, 0.5874249, 0.5874249, 0.664, 0.5874249), 
    Shear.int_single.lane = c(0.3718993, 0.3718993, 0.3718993, 
    0.3718993, 0.3718993, 0.3718993, 0.3718993, 0.3718993, 0.3718993, 
    0.3718993, 0.3718993, 0.431, 0.3718993)), class = "data.frame", row.names = c("Baseline", 
"Sample1", "Sample2", "Sample3", "Sample4", "Sample5", "Sample6", 
"Sample7", "Sample8", "Sample9", "Sample10", "AASHTO", "Mean"
)))

data.table

library(data.table)
merge(
  melt(df1, id.vars="Source",
       measure = patterns(m="^Moment.*"), value.name = "Moment", variable.name = "Type",
       variable.factor = FALSE, value.factor = FALSE)[, Type := gsub("^Moment\\.(.*)\\.lane", "\\1", Type) ],
  melt(df2, id.vars="Source",
       measure = patterns(m="^Shear.*"), value.name = "Shear", variable.name = "Type",
       variable.factor = FALSE, value.factor = FALSE)[, Type := gsub("^Shear\\.(.*)\\.lane", "\\1", Type) ],
  by = c("Source", "Type")
)
#       Source       Type    Moment     Shear
#  1:   AASHTO  ext_multi 0.7550000 0.7550000
#  2:   AASHTO ext_single        NA        NA
#  3:   AASHTO  int_multi 0.6640000 0.6640000
#  4:   AASHTO int_single 0.4310000 0.4310000
#  5: Baseline  ext_multi 0.7109148 0.7109148
#  6: Baseline ext_single 0.5367121 0.5367121
#  7: Baseline  int_multi 0.5874249 0.5874249
#  8: Baseline int_single 0.3718993 0.3718993
#  9:     Mean  ext_multi 0.7109148 0.7109148
# 10:     Mean ext_single 0.5367121 0.5367121
# 11:     Mean  int_multi 0.5874249 0.5874249
# 12:     Mean int_single 0.3718993 0.3718993
# 13:  Sample1  ext_multi 0.7109148 0.7109148
# 14:  Sample1 ext_single 0.5367121 0.5367121
# 15:  Sample1  int_multi 0.5874249 0.5874249
# 16:  Sample1 int_single 0.3718993 0.3718993
# 17: Sample10  ext_multi 0.7109148 0.7109148
# 18: Sample10 ext_single 0.5367121 0.5367121
# 19: Sample10  int_multi 0.5874249 0.5874249
# 20: Sample10 int_single 0.3718993 0.3718993
# 21:  Sample2  ext_multi 0.7109148 0.7109148
# 22:  Sample2 ext_single 0.5367121 0.5367121
# 23:  Sample2  int_multi 0.5874249 0.5874249
# 24:  Sample2 int_single 0.3718993 0.3718993
# 25:  Sample3  ext_multi 0.7109148 0.7109148
# 26:  Sample3 ext_single 0.5367121 0.5367121
# 27:  Sample3  int_multi 0.5874249 0.5874249
# 28:  Sample3 int_single 0.3718993 0.3718993
# 29:  Sample4  ext_multi 0.7109148 0.7109148
# 30:  Sample4 ext_single 0.5367121 0.5367121
# 31:  Sample4  int_multi 0.5874249 0.5874249
# 32:  Sample4 int_single 0.3718993 0.3718993
# 33:  Sample5  ext_multi 0.7109148 0.7109148
# 34:  Sample5 ext_single 0.5367121 0.5367121
# 35:  Sample5  int_multi 0.5874249 0.5874249
# 36:  Sample5 int_single 0.3718993 0.3718993
# 37:  Sample6  ext_multi 0.7109148 0.7109148
# 38:  Sample6 ext_single 0.5367121 0.5367121
# 39:  Sample6  int_multi 0.5874249 0.5874249
# 40:  Sample6 int_single 0.3718993 0.3718993
# 41:  Sample7  ext_multi 0.7109148 0.7109148
# 42:  Sample7 ext_single 0.5367121 0.5367121
# 43:  Sample7  int_multi 0.5874249 0.5874249
# 44:  Sample7 int_single 0.3718993 0.3718993
# 45:  Sample8  ext_multi 0.7109148 0.7109148
# 46:  Sample8 ext_single 0.5367121 0.5367121
# 47:  Sample8  int_multi 0.5874249 0.5874249
# 48:  Sample8 int_single 0.3718993 0.3718993
# 49:  Sample9  ext_multi 0.7109148 0.7109148
# 50:  Sample9 ext_single 0.5367121 0.5367121
# 51:  Sample9  int_multi 0.5874249 0.5874249
# 52:  Sample9 int_single 0.3718993 0.3718993
#       Source       Type    Moment     Shear


數據

df1 <- read.table(header=T, stringsAsFactors=F, text="
         Moment.ext_multi.lane   Moment.ext_single.lane   Moment.int_multi.lane  Moment.int_single.lane
Baseline   0.7109148                  0.5367121               0.5874249               0.3718993
Sample1    0.7109148                  0.5367121               0.5874249               0.3718993
Sample2    0.7109148                  0.5367121               0.5874249               0.3718993
Sample3    0.7109148                  0.5367121               0.5874249               0.3718993
Sample4    0.7109148                  0.5367121               0.5874249               0.3718993
Sample5    0.7109148                  0.5367121               0.5874249               0.3718993
Sample6    0.7109148                  0.5367121               0.5874249               0.3718993
Sample7    0.7109148                  0.5367121               0.5874249               0.3718993
Sample8    0.7109148                  0.5367121               0.5874249               0.3718993
Sample9    0.7109148                  0.5367121               0.5874249               0.3718993
Sample10   0.7109148                  0.5367121               0.5874249               0.3718993
AASHTO     0.7550000                  NA                      0.6640000               0.4310000
Mean       0.7109148                  0.5367121               0.5874249               0.3718993")
df1$Source <- rownames(df1)
rownames(df1) <- NULL
setDT(df1)

df2 <- read.table(header=T, stringsAsFactors=F, text="
         Shear.ext_multi.lane   Shear.ext_single.lane   Shear.int_multi.lane  Shear.int_single.lane
Baseline   0.7109148                  0.5367121               0.5874249               0.3718993
Sample1    0.7109148                  0.5367121               0.5874249               0.3718993
Sample2    0.7109148                  0.5367121               0.5874249               0.3718993
Sample3    0.7109148                  0.5367121               0.5874249               0.3718993
Sample4    0.7109148                  0.5367121               0.5874249               0.3718993
Sample5    0.7109148                  0.5367121               0.5874249               0.3718993
Sample6    0.7109148                  0.5367121               0.5874249               0.3718993
Sample7    0.7109148                  0.5367121               0.5874249               0.3718993
Sample8    0.7109148                  0.5367121               0.5874249               0.3718993
Sample9    0.7109148                  0.5367121               0.5874249               0.3718993
Sample10   0.7109148                  0.5367121               0.5874249               0.3718993
AASHTO     0.7550000                  NA                      0.6640000               0.4310000
Mean       0.7109148                  0.5367121               0.5874249               0.3718993")
df2$Source <- rownames(df2)
rownames(df2) <- NULL
setDT(df2)

暫無
暫無

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

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