为什么 pivot_longer() 在其输出中只嵌套四个整数值

Why pivot_longer() nests simply four integer values in its output

我想知道为什么我的 pivot_longer() 在 returns 下调用 value 列下的嵌套输出?

foo <- function(){ 
 n_subj = 5
 n_trials = 20
 subj_intercepts = rnorm(n_subj, 0, 1)
 slope = .6
 mx = 30
 data = data.frame(subject = rep(1:n_subj, each=n_trials),
                   intercept = rep(subj_intercepts, each=n_trials)) %>%
   mutate(x = rnorm(n(), mx, 1),
          y = intercept + slope*(x-mean(x)) + rnorm(n(), 0, 1))
 
mlm = coef(summary(lmer(y ~ x + (1|subject), data=data)))[2,1]
ols = coef(summary(lm(y ~ x, data=data)))[2,1]
list(ols=ols, mlm=mlm)
}
 
kk <- data.frame(t(replicate(2, foo())))

pivot_longer(kk, everything())

#  name  value    
#  <chr> <list>   
#1 ols   <dbl [1]>
#2 mlm   <dbl [1]>
#3 ols   <dbl [1]>
#4 mlm   <dbl [1]>

让我们仔细看看kk:

kk <- data.frame(t(replicate(2, foo())))

returns

        ols       mlm
1 0.6450264 0.6830734
2 0.6443189 0.6523727

但是如果我们将它转​​换成小标题,这会为我们提供更多信息

tibble(kk)

我们看到 data.frame 实际上包含 lists.

# A tibble: 2 x 2
  ols       mlm      
  <list>    <list>   
1 <dbl [1]> <dbl [1]>
2 <dbl [1]> <dbl [1]>

所以 pivot_longer 将 data.frame 转换为小标题,只是向您展示数据的“真实”形式。

提取 kk 的一个元素得到相同的结果:

kk[1,1]
#> [[1]]
#> [1] 0.6450264

您正在您的函数中创建一个列表:Add/Wrap unlist 在您的函数代码末尾得到一个 tibble:

foo <- function(){ 
    n_subj = 5
    n_trials = 20
    subj_intercepts = rnorm(n_subj, 0, 1)
    slope = .6
    mx = 30
    data = data.frame(subject = rep(1:n_subj, each=n_trials),
                      intercept = rep(subj_intercepts, each=n_trials)) %>%
        mutate(x = rnorm(n(), mx, 1),
               y = intercept + slope*(x-mean(x)) + rnorm(n(), 0, 1))
    
    mlm = coef(summary(lmer(y ~ x + (1|subject), data=data)))[2,1]
    ols = coef(summary(lm(y ~ x, data=data)))[2,1]
    unlist(list(ols=ols, mlm=mlm))
}

输出

  name  value
  <chr> <dbl>
1 ols   0.600
2 mlm   0.581
3 ols   0.441
4 mlm   0.528

我建议 return 在函数末尾使用 tibble/data.frame 而不是 list.

library(dplyr)
library(purrr)

foo <- function(){ 
    #...
    #...
    tibble(ols=ols, mlm=mlm)
}

然后我们可以用 simplify = FALSE replicate 并用 bind_rows 绑定输出。

kk <- bind_rows(replicate(2, foo(), simplify = FALSE))
kk

# A tibble: 2 x 2
#    ols   mlm
#  <dbl> <dbl>
#1 0.862 0.681
#2 0.685 0.581

pivot_longer(kk, everything())

#  name  value
#  <chr> <dbl>
#1 ols   0.862
#2 mlm   0.681
#3 ols   0.685
#4 mlm   0.581