r语言 - 通过在一个向量上应用突变来创建多个新列(理想情况下是tidyverse) ?



我正在尝试在一些贝叶斯统计中模拟线性回归的数据集。

显然整个公式是Y = a + bx我使用

模拟了a和B的各种值
A <- rnorm(10,0,1)
B <- rnorm(10,0,1)
#10 Random draws from a normal distribution for the values of each of A and B

我设置了一个X的可能值列表

stuff <- tibble(x  = seq(130,170,10)) %>%
#Make table for possible values of X between 130>170 in intervals of 10
mutate(Y = A + B*x)
Make new value which is A plus B*each value of X

当我在A &中只有一个值时,这工作得很好;B(即如果我做A <- rnorm(1,0,1))但很明显,当A &B在1

我想弄清楚如何做一些事情,就像

mutate(Y[i] = A[i] + B[i]*x

产生10个新列Y1>Y10

欢迎提出建议

以下是我认为你想要的。我将开始长,然后转换为宽…

library(tidyverse)
set.seed(123)
df <- tibble() %>% 
expand(
nesting(
ID=1:10,
A=rnorm(10,0,1),
B=rnorm(10,0,1)
),
X=seq(130,170,10)
) %>% 
mutate(Y=A + B*X)
df
# A tibble: 50 × 5
ID      A      B     X     Y
<int>  <dbl>  <dbl> <dbl> <dbl>
1     1 -1.07   0.426   130  54.4
2     1 -1.07   0.426   140  58.6
3     1 -1.07   0.426   150  62.9
4     1 -1.07   0.426   160  67.2
5     1 -1.07   0.426   170  71.4
6     2 -0.218 -0.295   130 -38.6
7     2 -0.218 -0.295   140 -41.5
8     2 -0.218 -0.295   150 -44.5
9     2 -0.218 -0.295   160 -47.4
10     2 -0.218 -0.295   170 -50.4
# … with 40 more rows

现在,转向宽…

df %>% 
pivot_wider(
names_from=ID,
values_from=Y,
names_prefix="Y",
id_cols=X
)
# A tibble: 5 × 11
X    Y1    Y2    Y3    Y4    Y5    Y6    Y7     Y8    Y9   Y10
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl>
1   130  54.4 -38.6  115.  113.  106.  87.8  72.8  -7.90 -40.9 -48.2
2   140  58.6 -41.5  124.  122.  114.  94.7  78.4  -8.51 -44.0 -52.0
3   150  62.9 -44.5  133.  131.  123. 102.   83.9  -9.13 -47.0 -55.8
4   160  67.2 -47.4  142.  140.  131. 108.   89.5  -9.75 -50.1 -59.6
5   170  71.4 -50.4  151.  149.  139. 115.   95.0 -10.4  -53.2 -63.4

此时你已经失去了A &B,因为你需要另外10列来存储原来的A,另外10列来存储原来的B。

就我个人而言,我可能会坚持使用长格式,因为这最有可能使你未来的工作流程更容易。我可以保留A和B。

最新更新