使用公式在 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,然后分配 list
的 vector
通过 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)
}
我对 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,然后分配 list
的 vector
通过 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)
}