使用公式在 R 中创建多列

Create multiple columns in R using a formula

我对 R 有点陌生,正在尝试找到一种基于公式创建多列的简化方法。

我有一个数据集,它有一个基准日期,后面跟着每周的分数(分数 1 = 基准日期后 1 周的分数)。我想为每周生成一个日期,即将 X*7 添加到基准日期。我找到了一种方法,只需一次创建每个日期变量(见下文),但由于我有超过 500 个分数,我想知道是否有一种不占用数百行的简化方法代码。

Dataset$score1_date <- Dataset$base_date + (1*7)
Dataset$score2_date <- Dataset$base_date + (2*7)
Dataset$score3_date <- Dataset$base_date + (3*7)

这是一个示例数据集:

Dataset <- structure(list(id = c(1, 2, 3), base_date = structure(c(18628, 18633, 18641), class = "Date"), score1 = c(4, 5, 5), score2 = c(6, 5, 2), score3 = c(5, 5, 1)), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))

谢谢!

我们可以使用 lapply 遍历乘数索引,即 OP 的 post 中的 1:3,乘以 7 并加到 base_date,然后分配 listvector 通过 paste 将 'score' 与索引和 '_date'

合并到新列
Dataset[paste0('score', 1:3, '_date')] <- lapply(1:3, 
          function(i) Dataset$base_date + i*7)   

或使用 dplyr,循环 across 'score' 列,从列名 (cur_column()) 中提取数字部分与 parse_number,相乘通过 7 并添加到 'base_date',同时通过添加“_date”来修改 .names 中的列名称以创建新列

library(dplyr)
Dataset <- Dataset %>% 
   mutate(across(starts_with('score'), ~ base_date + 
     (readr::parse_number(cur_column())) * 7, .names = '{.col}_date'))

-输出

Dataset
# A tibble: 3 x 8
#     id base_date  score1 score2 score3 score1_date score2_date score3_date
#  <dbl> <date>      <dbl>  <dbl>  <dbl> <date>      <date>      <date>     
#1     1 2021-01-01      4      6      5 2021-01-08  2021-01-15  2021-01-22 
#2     2 2021-01-06      5      5      5 2021-01-13  2021-01-20  2021-01-27 
#3     3 2021-01-14      5      2      1 2021-01-21  2021-01-28  2021-02-04 

您可以尝试使用 for 循环并使用双括号(即 [[.]])指示 data.frame 的列。例如:

for (i in c(1:500)){
  Dataset[[paste0("score", i, "_date")]] <- Dataset$base_date + (i*7)
}