R bind_rows()错误:参数1必须具有名称

时间:2019-03-21 10:30:21

标签: r

我有3个数据框。每个df都有3个A变量和3个B变量以及3个阈值(1、2、3)

df1 <- tibble(
var1A= rnorm(1:10) +1,
var1B= rnorm(1:10) +1,
var2A= rnorm(1:10) +2,
var2B= rnorm(1:10) +2,
var3A= rnorm(1:10) +3,
var3B= rnorm(1:10) +3)


df2 <- tibble(
var1A= rnorm(1:10) +1,
var1B= rnorm(1:10) +1,
var2A= rnorm(1:10) +2,
var2B= rnorm(1:10) +2,
var3A= rnorm(1:10) +3,
var3B= rnorm(1:10) +3)


df3 <- tibble(
var1A= rnorm(1:10) +1,
var1B= rnorm(1:10) +1,
var2A= rnorm(1:10) +2,
var2B= rnorm(1:10) +2,
var3A= rnorm(1:10) +3,
var3B= rnorm(1:10) +3)

thresholds = c(1, 2, 3)
list_dfs = c('df1','df2','df3')

现在,我想对所有A变量和B变量以及所有dfs执行t.test(例如t.test df1 $ var1A和df1 $ var1B)。我将在matrixTests::col_t_welch()

的帮助下执行t.test
map(list_dfs,
function(df_name){
  x <- get(df_name)
  lapply(thresholds, function(i){

    col_t_welch(x %>%
             pull(paste0("var",i,"A")), 
           x %>% 
             pull(paste0("var",i,"B")))

  }) 
}) 

现在我为varA和varB的t.test的每个阈值和每个df分配一个表。

最后,我想用bind_rows()绑定所有这些表。但是然后我收到一条错误消息:参数1必须具有名称

map(list_dfs,
function(df_name){
  x <- get(df_name)
  lapply(thresholds, function(i){

    col_t_welch(x %>%
             pull(paste0("var",i,"A")), 
           x %>% 
             pull(paste0("var",i,"B")))

  }) 
}) %>% bind_rows

Error: Argument 1 must have names

有人可以帮助我如何避免这个问题?

2 个答案:

答案 0 :(得分:2)

这是您想要的结果吗?

首先,根据您的问题,我加载库并创建数据。

library(tibble)
library(purrr)
library(dplyr)
library(matrixTests)

df1 <- tibble(
  var1A= rnorm(1:10) +1,
  var1B= rnorm(1:10) +1,
  var2A= rnorm(1:10) +2,
  var2B= rnorm(1:10) +2,
  var3A= rnorm(1:10) +3,
  var3B= rnorm(1:10) +3)


df2 <- tibble(
  var1A= rnorm(1:10) +1,
  var1B= rnorm(1:10) +1,
  var2A= rnorm(1:10) +2,
  var2B= rnorm(1:10) +2,
  var3A= rnorm(1:10) +3,
  var3B= rnorm(1:10) +3)


df3 <- tibble(
  var1A= rnorm(1:10) +1,
  var1B= rnorm(1:10) +1,
  var2A= rnorm(1:10) +2,
  var2B= rnorm(1:10) +2,
  var3A= rnorm(1:10) +3,
  var3B= rnorm(1:10) +3)

thresholds = c(1, 2, 3)
list_dfs = c('df1','df2','df3')

在这里,我unlist绑定前的结果。

map(list_dfs,
    function(df_name){
      x <- get(df_name)
      lapply(thresholds, function(i){

        col_t_welch(x %>%
                      pull(paste0("var",i,"A")), 
                    x %>% 
                      pull(paste0("var",i,"B")))

      }) 
    }) %>% 
  unlist(recursive = FALSE) %>% 
  bind_rows()

给出,

#>   obs.x obs.y obs.tot    mean.x    mean.y   mean.diff     var.x     var.y
#> 1    10    10      20 0.4123358 0.9386079 -0.52627205 1.2887733 1.4188697
#> 2    10    10      20 1.4848642 1.8852731 -0.40040891 0.7594906 1.9971866
#> 3    10    10      20 2.9905342 3.1454473 -0.15491307 0.9501264 0.6863846
#> 4    10    10      20 1.2409187 0.9453490  0.29556964 1.8969049 0.5213807
#> 5    10    10      20 2.0823664 2.3150223 -0.23265591 0.5171046 0.6771720
#> 6    10    10      20 3.0354769 2.2958400  0.73963696 0.8915344 1.1509940
#> 7    10    10      20 0.5546491 0.8868825 -0.33223340 0.6404670 0.4313640
#> 8    10    10      20 2.9031533 2.5956085  0.30754479 1.1602239 1.6080605
#> 9    10    10      20 3.1435888 3.1988889 -0.05530018 1.7926813 0.4374122
#>      stderr       df  statistic    pvalue   conf.low conf.high alternative
#> 1 0.5203502 17.95854 -1.0113806 0.3252679 -1.6196681 0.5671240   two.sided
#> 2 0.5250407 14.98023 -0.7626246 0.4575287 -1.5196353 0.7188175   two.sided
#> 3 0.4045381 17.54432 -0.3829381 0.7063657 -1.0064012 0.6965751   two.sided
#> 4 0.4917607 13.59994  0.6010437 0.5576963 -0.7620703 1.3532096   two.sided
#> 5 0.3455831 17.68236 -0.6732272 0.5095070 -0.9596350 0.4943232   two.sided
#> 6 0.4519434 17.71416  1.6365699 0.1193625 -0.2109603 1.6902343   two.sided
#> 7 0.3273883 17.34004 -1.0147992 0.3241530 -1.0219320 0.3574652   two.sided
#> 8 0.5261449 17.54094  0.5845249 0.5663102 -0.7999219 1.4150114   two.sided
#> 9 0.4722387 13.14519 -0.1171022 0.9085494 -1.0743655 0.9637651   two.sided
#>   mean.null conf.level
#> 1         0       0.95
#> 2         0       0.95
#> 3         0       0.95
#> 4         0       0.95
#> 5         0       0.95
#> 6         0       0.95
#> 7         0       0.95
#> 8         0       0.95
#> 9         0       0.95

reprex package(v0.2.1)于2019-03-21创建

答案 1 :(得分:1)

如果您有两种不同的数据库数据类型,则可以在data.frame的帮助下将它们转换为相同的格式。例如如果一个数据库是列表类型,而另一个数据库是双精度类型,反之亦然,那么您想将两者合并,则首先将它们都转换为data.frame,然后使用cbind使用两个数据帧。

combine_data <-cbind(data.frame(data_r),data.frame(data_c))