r - 在循环中引用数据表列名称中的数字
问题描述
我有一个像这里的数据集:
customer_id <- c("1","1","1","2","2","2","2","3","3","3")
account_id <- as.character(c(11,11,11,55,55,55,55,38,38,38))
time <- c(as.Date("2017-01-01","%Y-%m-%d"), as.Date("2017-02-01","%Y-%m-%d"), as.Date("2017-03-01","%Y-%m-%d"),
as.Date("2017-12-01","%Y-%m-%d"), as.Date("2018-01-01","%Y-%m-%d"), as.Date("2018-02-01","%Y-%m-%d"),
as.Date("2018-03-01","%Y-%m-%d"), as.Date("2018-04-01","%Y-%m-%d"), as.Date("2018-05-01","%Y-%m-%d"),
as.Date("2018-06-01","%Y-%m-%d"))
tenor <- c(1,2,3,1,2,3,4,1,2,3)
variable_x <- c(87,90,100,120,130,150,12,13,15,14)
my_data <- data.table(customer_id,account_id,time,tenor,variable_x)
现在,我想创建新变量“PD_Q1”到“PD_Q20”,当“tenor”等于1到20时,它等于“variable_x”的值,即如果tenor = 1,PD_Q1等于variable_x的值, PD_Q2 等于 variable_x 的值,如果 Tenor = 2 等,我想通过 customer_id,account_id 来做到这一点。我有代码,但是仅适用于 PD_Q1,我想创建一个循环,在 i = 1:20 上循环,在其中我只更改 Tenor == i (这很容易)并在此循环中引用列 PD_Qi ,这对我来说是个问题。i 的一个值的代码在这里:
my_data[tenor == 1, PD_Q1_temp := variable_x, by = c("customer_id", "account_id")]
list_accs <- my_data[tenor == 1, c("customer_id", "account_id", "PD_Q1_temp")]
list_accs <- unique(list_accs, by = c("customer_id", "account_id"))
names(list_accs) = c("customer_id", "account_id", "PD_Q1")
my_data = merge(x = my_data, y = list_accs, by = c("customer_id", "account_id"), all.x = TRUE)
my_data$PD_Q1_temp <- NULL
现在,您能否建议如何制作一个从 1 到 20 的循环,其中 PD_Q1_temp 和 PD_Q1 会发生变化?具体来说,我不知道如何在循环中使用这个 i 索引来引用列名或变量。
i = 1 和 i = 2(创建变量 PD_Q1 和 PD_Q2)的预期输出如下:
> my_data
customer_id account_id time tenor variable_x PD_Q1 PD_Q2
1:1 11 2017-01-01 1 87 87 90 2:1 11 2017-02-01 2 90 87 90 3:1 11 2017-03-01 3 100 87 90 4:2 55 2017-12-01 1 120 120 130 5: 2 55 2018-01-01 2 130 120 130 6: 2 55 2018-02-01 3 150 120 130 7: 2 55 2018-03-01 4 12 120 130 8: 3 38 2018-04-01 1 13 13 15 9: 3 38 2018-05-01 2 15 13 15 10: 3 38 2018-06-01 3 14 13 15
现在我想使用上面的代码创建一个这样的变量,在循环中创建 PD_Q3、PD_Q4 等。
解决方案
你能展示你的预期输出吗?
我认为你可以做你想做的事tidyr::gather()
:
library(dplyr)
library(tidyr)
my_data %>%
tbl_df() %>%
select(-time) %>%
mutate(tenor = paste0("PD_Q", tenor)) %>%
spread(tenor, variable_x)
# # A tibble: 3 x 6
# customer_id account_id PD_Q1 PD_Q2 PD_Q3 PD_Q4
# <chr> <chr> <dbl> <dbl> <dbl> <dbl>
# 1 1 11 87 90 100 NA
# 2 2 55 120 130 150 12
# 3 3 38 13 15 14 NA
推荐阅读
- mongodb - Spring Data 中的 MongoDB $addField 和 $indexOfArray
- java - 在 Fragment 的 MainActivity 之外使用 BottomNavigationView
- .net - 带有 MSDeploy.exe 的 Bitbucket 管道
- django - django静态文件设置有问题
- functional-programming - 使用延续传递样式简化多路树遍历
- reactjs - 如何有效地查询多个 React 组件中的相同 Firestore 数据?
- azure - AKS 持久卷关联性?
- python-3.x - Python setuptools:如何在 Nexus 上托管的私有 PyPI 存储库中指定依赖项?
- python-3.x - DJANGO 中的 Argon2 和会话变量中的密码
- powershell - Powershell:在对象中查找值并在另一列中获取其对应的值