通过在向量上应用 mutate 来创建多个新列(最好是 tidyverse)?
Make multiple new columns (ideally tidyverse) by applying mutate across a vector?
我正在尝试模拟数据集以在一些贝叶斯统计数据中进行线性回归。
显然整体公式是
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 中只有 1 个值时(即如果我这样做 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。
我正在尝试模拟数据集以在一些贝叶斯统计数据中进行线性回归。
显然整体公式是 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 中只有 1 个值时(即如果我这样做 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。