这接近你想要的吗?
library(tidyverse)
library(extraDistr)
set.seed(1)
n <- 100
x_max <- 4
data <-
tibble(
id = 1:n,
beta = rnorm(n, mean = 0, sd = 1/(x_max - 1)),
delta = cbind(0, rdirichlet(n, rep(1, x_max - 1)))
) %>%
expand_grid(x = 1:x_max)
data %>%
rowwise() %>%
mutate(
y = beta * sum(delta[,1:x])
)
#> # A tibble: 400 Ã 5
#> # Rowwise:
#> id beta delta[,1] [,2] [,3] [,4] x y
#> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
#> 1 1 -0.209 0 0.169 0.170 0.661 1 0
#> 2 1 -0.209 0 0.169 0.170 0.661 2 -0.0352
#> 3 1 -0.209 0 0.169 0.170 0.661 3 -0.0708
#> 4 1 -0.209 0 0.169 0.170 0.661 4 -0.209
#> 5 2 0.0612 0 0.0962 0.00297 0.901 1 0
#> 6 2 0.0612 0 0.0962 0.00297 0.901 2 0.00589
#> 7 2 0.0612 0 0.0962 0.00297 0.901 3 0.00607
#> 8 2 0.0612 0 0.0962 0.00297 0.901 4 0.0612
#> 9 3 -0.279 0 0.241 0.714 0.0451 1 0
#> 10 3 -0.279 0 0.241 0.714 0.0451 2 -0.0671
#> # â¹ 390 more rows
我认为混乱
c_across
是的
delta
从技术上讲,表现为一列(矩阵),因此不能“跨”求和:
str(data)
#> tibble [400 Ã 4] (S3: tbl_df/tbl/data.frame)
#> $ id : int [1:400] 1 1 1 1 2 2 2 2 3 3 ...
#> $ beta : num [1:400] -0.2088 -0.2088 -0.2088 -0.2088 0.0612 ...
#> $ delta: num [1:400, 1:4] 0 0 0 0 0 0 0 0 0 0 ...
#> $ x : int [1:400] 1 2 3 4 1 2 3 4 1 2 ...