【问题标题】:Create multiple columns in R using a formula使用公式在 R 中创建多列
【发布时间】:2021-04-29 18:47:06
【问题描述】:

我对 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"))

谢谢!

【问题讨论】:

    标签: r dplyr formula multiple-columns


    【解决方案1】:

    我们可以使用lapply 循环乘数索引,即OP 帖子中的1:3,乘以7 并添加到base_date,然后将vectors 的list 分配给paste 的新列使用索引和 '_date' 获取 'score'

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

    或者使用dplyr,循环across'score'列,使用parse_number从列名(cur_column())中提取数字部分,乘以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 
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-17
        • 2012-12-10
        • 2023-03-06
        • 1970-01-01
        • 2015-06-25
        • 2020-09-15
        • 1970-01-01
        • 2019-01-26
        相关资源
        最近更新 更多