`dplyr::bind_rows` 在组合列出的小标题时不起作用

`dplyr::bind_rows` not working while combining listed tibbles

如下所示,我想通过将行堆叠在一起来将四个数据帧合并为一个数据帧。列名相同,所以不确定为什么这不起作用。

set.seed(123)
library(quantreg)
#> Loading required package: SparseM
#> 
#> Attaching package: 'SparseM'
#> The following object is masked from 'package:base':
#> 
#>     backsolve
library(tidyverse)

# crq example with left censoring
n <- 200
x <-rnorm(n)
y <- 5 + x + rnorm(n)
c <- 4 + x + rnorm(n)
d <- (y > c)

# model
f <- crq(survival::Surv(pmax(y,c), d, type = "left") ~ x, method = "Portnoy")

# converting list to tibbles
(ls_f <- purrr::map(summary(f), tibble::as_tibble))
#> [[1]]
#> # A tibble: 2 x 6
#>     tau coefficients[,"~ [,"Lower Bd"] [,"Upper Bd"] [,"Std Error"] [,"T Value"]
#>   <dbl>            <dbl>         <dbl>         <dbl>          <dbl>        <dbl>
#> 1   0.2            4.27          4.15           4.43         0.0701        60.9 
#> 2   0.2            0.975         0.755          1.41         0.166          5.86
#> # ... with 6 more variables: [,"Pr(>|t|)"] <dbl>, NAs <int>, cov[,1] <dbl>,
#> #   [,2] <dbl>, Brep <int>, bmethod <chr>
#> 
#> [[2]]
#> # A tibble: 2 x 6
#>     tau coefficients[,"~ [,"Lower Bd"] [,"Upper Bd"] [,"Std Error"] [,"T Value"]
#>   <dbl>            <dbl>         <dbl>         <dbl>          <dbl>        <dbl>
#> 1   0.4            4.85          4.68           5.04         0.0922         52.6
#> 2   0.4            0.926         0.774          1.05         0.0712         13.0
#> # ... with 6 more variables: [,"Pr(>|t|)"] <dbl>, NAs <int>, cov[,1] <dbl>,
#> #   [,2] <dbl>, Brep <int>, bmethod <chr>
#> 
#> [[3]]
#> # A tibble: 2 x 6
#>     tau coefficients[,"~ [,"Lower Bd"] [,"Upper Bd"] [,"Std Error"] [,"T Value"]
#>   <dbl>            <dbl>         <dbl>         <dbl>          <dbl>        <dbl>
#> 1   0.6            5.22          5.07           5.53          0.117        44.4 
#> 2   0.6            0.980         0.774          1.18          0.104         9.47
#> # ... with 6 more variables: [,"Pr(>|t|)"] <dbl>, NAs <int>, cov[,1] <dbl>,
#> #   [,2] <dbl>, Brep <int>, bmethod <chr>
#> 
#> [[4]]
#> # A tibble: 2 x 6
#>     tau coefficients[,"~ [,"Lower Bd"] [,"Upper Bd"] [,"Std Error"] [,"T Value"]
#>   <dbl>            <dbl>         <dbl>         <dbl>          <dbl>        <dbl>
#> 1   0.8            5.91          5.66           6.16         0.127          46.4
#> 2   0.8            0.974         0.775          1.11         0.0846         11.5
#> # ... with 6 more variables: [,"Pr(>|t|)"] <dbl>, NAs <int>, cov[,1] <dbl>,
#> #   [,2] <dbl>, Brep <int>, bmethod <chr>

# combining the dataframes from list into a single dataframe
dplyr::bind_rows(ls_f, .id = "id")
#> Error: Argument 2 must be length 2, not 12

reprex package (v0.3.0)

于 2019-12-29 创建

当您 运行 str(lsf[[1]] 时,您会发现并非所有列的长度都相同。

> str(ls_f[[1]])
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   2 obs. of  6 variables:
 $ tau         : num  0.2 0.2
 $ coefficients: num [1:2, 1:6] 4.267 0.975 4.152 0.755 4.426 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "Value" "Lower Bd" "Upper Bd" "Std Error" ...
 $ NAs         : int  0 0
 $ cov         : num [1:2, 1:2] 0.00619 -0.00101 -0.00101 0.02907
 $ Brep        : int  100 100
 $ bmethod     : chr  "jack" "jack"

问题列是 coefficientscov。您要做的是将列表中的项目转换为所有列中行数相等的数据框。

你可以试试这个:

> map_dfr(ls_f, ~matrix(.x%>%unlist(), nrow = 2, byrow=FALSE)%>%as.data.frame(), 
.id = 'id')%>%setNames(., c("id","tau","Coefficients","Lower Bd","Upper 
Bd","Std Error","T value", "Pr(>|t|)","NAs","Cov.1","Cov.2","Brep","bmethod"))

  id tau      Coefficients          Lower Bd
1  1 0.2  4.26723731325802  4.15151386918715
2  1 0.2 0.975337362554836 0.755135344862367
3  2 0.4  4.84960828201606   4.6759841894663
4  2 0.4 0.926379209201144 0.774080446159287
5  3 0.6  5.21842672746996  5.07393944600602
6  3 0.6 0.980382470437977 0.773903350749942
7  4 0.8  5.91300846399214  5.66442963978162
8  4 0.8 0.973822317385054  0.77490538175223
          Upper Bd          Std Error          T value
1 4.42630114851379 0.0701000838520821 60.8734979869968
2 1.40758057160874  0.166443167296128 5.85988225530196
3 5.03757343137807 0.0922438485512842  52.573785224495
4 1.05322615510482 0.0712119485733918 13.0087608576868
5 5.53451872047045  0.117496871906172 44.4133247363144
6 1.17991901434745  0.103577327644822 9.46522267691451
7 6.16404796355733  0.127455996058252 46.3925483842258
8 1.10644239537846 0.0845773229103572 11.5139884294659
              Pr(>|t|) NAs                Cov.1
1                    0   0  0.00619181512900162
2 4.63195481970047e-09   0 -0.00100787735092982
3                    0   0  0.00993640997874621
4                    0   0 -0.00191068720356238
5                    0   0   0.0115580325035132
6                    0   0 -0.00228295313931709
7                    0   0   0.0146462605811626
8                    0   0  0.00236162295400874
                 Cov.2 Brep bmethod
1 -0.00100787735092982  100    jack
2   0.0290671203153015  100    jack
3 -0.00191068720356238  100    jack
4  0.00883546932718665  100    jack
5 -0.00228295313931709  100    jack
6   0.0154261294271654  100    jack
7  0.00236162295400874  100    jack
8   0.0104356503143278  100    jack
There were 45 warnings (use warnings() to see them)

警告仅来自 dplyrbind_rows 强制字符和因子向量的绑定(map_dfr 使用 dplyr's bind_rows 函数) .您也可以使用 as.tibble() 代替 as.data.frame()