为什么 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 实际上包含 list
s.
# 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
我想知道为什么我的 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 实际上包含 list
s.
# 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