如何在R中根据列值创建新的随机列变量

4
我正在尝试运行一个模拟,但希望找到一种高效的方法来实现这个目标。
样本数据:
month <- 1:12
a <- rep(10, 12)
dat1 <- data.frame(month, a) 
sim_dat <- do.call(rbind, replicate(50, dat1, simplify = FALSE)) %>% 
  mutate(sim_index = rep(1:50, each = nrow(dat1)))

我想做的是为每个月创建一个新的变量,并为该月生成一个随机值。我目前的方法是使用dplyr,请参见下文:
sim_dat1 <- sim_dat %>% 
  group_by(sim_index) %>% 
  mutate(mnth1 = ifelse(month == 1, a + rnorm(n()), NA),
         mnth2 = ifelse(month == 2, a + rnorm(n()), NA),
         mnth3 = ifelse(month == 3, a + rnorm(n()), NA),
         mnth4 = ifelse(month == 4, a + rnorm(n()), NA),
         mnth5 = ifelse(month == 5, a + rnorm(n()), NA),
         mnth6 = ifelse(month == 6, a + rnorm(n()), NA),
         mnth7 = ifelse(month == 7, a + rnorm(n()), NA),
         mnth8 = ifelse(month == 8, a + rnorm(n()), NA),
         mnth9 = ifelse(month == 9, a + rnorm(n()), NA),
         mnth10 = ifelse(month == 10, a + rnorm(n()), NA),
         mnth11 = ifelse(month == 11, a + rnorm(n()), NA),
         mnth12 = ifelse(month == 12, a + rnorm(n()), NA))

这段代码能够运行,但效率不高。对于如何改进这段代码,你有什么建议吗?
1个回答

6
library(dplyr); library(tidyr)
sim_dat %>%
  mutate(col = paste0("mnth", month), num = a + rnorm(n())) %>%
  pivot_wider(names_from = col, values_from = num)

结果

# A tibble: 600 × 15
   month     a sim_index mnth1 mnth2 mnth3 mnth4 mnth5 mnth6 mnth7 mnth8 mnth9 mnth10 mnth11 mnth12
   <int> <dbl>     <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>
 1     1    10         1  9.46 NA     NA    NA   NA    NA     NA    NA    NA    NA        NA     NA
 2     2    10         1 NA     9.35  NA    NA   NA    NA     NA    NA    NA    NA        NA     NA
 3     3    10         1 NA    NA     10.5  NA   NA    NA     NA    NA    NA    NA        NA     NA
 4     4    10         1 NA    NA     NA    10.9 NA    NA     NA    NA    NA    NA        NA     NA
 5     5    10         1 NA    NA     NA    NA    8.87 NA     NA    NA    NA    NA        NA     NA
 6     6    10         1 NA    NA     NA    NA   NA     8.12  NA    NA    NA    NA        NA     NA
 7     7    10         1 NA    NA     NA    NA   NA    NA     10.4  NA    NA    NA        NA     NA
 8     8    10         1 NA    NA     NA    NA   NA    NA     NA    10.4  NA    NA        NA     NA
 9     9    10         1 NA    NA     NA    NA   NA    NA     NA    NA    12.7  NA        NA     NA
10    10    10         1 NA    NA     NA    NA   NA    NA     NA    NA    NA     9.12     NA     NA
# ℹ 590 more rows

太棒了!这个简直就像魔法一样有效。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接