使用公式在R中创建多个列

3

我对R比较陌生,正在寻找一种简化的方式根据公式创建多个列。

我有一个数据集,其中包含基准日期和每周得分(score1 = 基准日期后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"))

谢谢!

2个回答

2
我们可以使用lapply循环遍历乘数索引,即OP帖子中的1:3,将其乘以7并加到base_date上,然后通过paste将'score'与索引和'_date'粘贴在一起,并将list向量分配给新列。
Dataset[paste0('score', 1:3, '_date')] <- lapply(1:3, 
          function(i) Dataset$base_date + i*7)   

或者使用 dplyr,循环遍历 'score' 列,使用 cur_column() 提取列名中的数字部分,再使用 parse_number 函数将其转换为数字,乘以 7 并加上 'base_date',同时通过在 .names 中添加 '_date' 来修改列名以创建新列。

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 

1

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

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

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