我想改變生成Output. 是否可以在下面的這種情況下使用該data.table功能?如果是的話,你能幫我調整一下嗎?我在下面插入了一個已完成計算的示例。下面的代碼來自一個已經解決的問題:如何調整輸出表生成的規范
library(dplyr)
library(tidyverse)
library(lubridate)
df1 <- structure(list(date1 = c("2021-06-28"),
date2 = c("2021-06-30"),
Category = c("FDE"),
Week = c("Wednesday"),
DR1 = c(4), DRM001 = c(4), DRM002 = c(2),
DRM003 = c(9), DRM004 = c(5), DRM005 = c(5),
DRM006 = c(2),DRM007 = c(1),
coef = c(8)), class = "data.frame", row.names = c(NA, -1L))
Output<-df1 %>%
mutate(across(starts_with("DR"), ~ coef - .),
across(contains("date"), ymd),
datedif = parse_number(as.character(date2-date1))
) %>%
rename_with(~str_replace(.,'(?<=[A-Z])0 (?=.)', ""),starts_with('DR')) %>%
rowwise %>%
mutate(Result = if (str_c('DRM', datedif) %in% names(.)) get(str_c('DRM', datedif)) else coef) %>%
ungroup() %>%
select(coef, Result)%>%data.frame()
> Output
coef Result
1 8 6
例如:見 thatcoef是 8 和 之間的差date1是date22,所以Result等于coef - DRM2。如果日期之間的差異是 3 那么它將是Result = coef - DRM3
date1 date2 Category Week DR1 DRM1 DRM2 DRM3 DRM4 DRM5 DRM6 DRM7 coef datedif
1 2021-06-28 2021-06-30 FDE Wednesday 4 4 6 -1 3 3 6 7 8 2
查看:
df1<-structure(list(Id = 8, date1 = structure(19090L, class = c("IDate",
"Date")), date2 = structure(19090L, class = c("IDate",
"Date")), Week = "Sexta-feira", DT = "0", Category = "PUBBAR",
GR = 1, DR1 = 14, DayM = 1, DayM1 = 1, DayM2 = 0,
DayM3 = 0, DayM4 = 1, DayM5 = 1, DayM6 = 1, DayM7 = 2, DayM8 = 2,
DayM9 = 2, DayM10 = 2, DayM11 = 4, DayM12 = 4, DayM13 = 4,
DayM14 = 4, DayM15 = 4, DayM16 = 4, DayM17 = 4, DayM18 = 4,
DayM19 = 4, DayM20 = 6, DayM21 = 6, DayM22 = 8, DayM23 = 8,
DayM24 = 8, DayM25 = 8, DayM26 = 8, DayM27 = 8, DayM28 = 8,
DayM29 = 8, DayM30 = 8, DayM31 = 10, DayM32 = 10, DayM33 = 10,
DayM34 = 10, DayM35 = 10, DayM36 = 10, DayM37 = 9, DayM38 = 9,
DayM39 = 9, DayM40 = 9, DayM41 = 9, DayM42 = 9, DayM43 = 9,
DayM44 = 9, DayM45 = 9, DayM46 = 9, DayM47 = 9, DayM48 = 9,
DayM49 = 9, DayM50 = 10, DayM51 = 10, DayM52 = 10, DayM53 = 10,
DayM54 = 10, DayM55 = 10, DayM56 = 10, DayM57 = 10, DayM58 = 10,
DayM59 = 10, DayM60 = 10, DayM61 = 10, DayM62 = 10, DayM63 = 10,
DayM64 = 10, DayM65 = 10, DayM66 = 10, DayM67 = 10, DayM68 = 10,
DayM69 = 10, DayM70 = 10, DayM71 = 10, DayM72 = 10, DayM73 = 10,
DayM74 = 10, DayM75 = 10, DayM76 = 10, DayM77 = 10, DayM78 = 10,
DayM79 = 10, DayM80 = 10, DayM81 = 10, DayM82 = 10, DayM83 = 10,
DayM84 = 10, DayM85 = 10, DayM86 = 10, DayM87 = 10, DayM88 = 10,
DayM89 = 10, DayM90 = 10, DayM91 = 10, DayM92 = 10, DayM93 = 10,
DayM94 = 10, DayM95 = 10, DayM96 = 10, DayM97 = 10, DayM98 = 10,
DayM99 = 10, DayM100 = 10, DayM101 = 10, DayM102 = 10, DayM103 = 10,
DayM104 = 10, DayM105 = 10, DayM106 = 10, DayM107 = 10, DayM108 = 10,
DayM109 = 10, DayM110 = 10, DayM111 = 10, DayM112 = 10, DayM113 = 10,
DayM114 = 10, DayM115 = 10, DayM116 = 10, DayM117 = 10, DayM118 = 10,
DayM119 = 10, DayM120 = 10, DayM121 = 10, DayM122 = 10, DayM123 = 10,
DayM124 = 10, DayM125 = 10, DayM126 = 10, DayM127 = 10, DayM128 = 10,
DayM129 = 10, DayM130 = 10, DayM131 = 12, DayM132 = 12, DayM133 = 12,
DayM134 = 12, DayM135 = 12, DayM136 = 12, DayM137 = 12, DayM138 = 12,
DayM139 = 12, DayM140 = 12, DayM141 = 12, DayM142 = 12, DayM143 = 12,
DayM144 = 12, DayM145 = 13, DayM146 = 13, DayM147 = 13, DayM148 = 13,
DayM149 = 13, DayM150 = 13, DayM151 = 13, DayM152 = 13, DayM153 = 14,
DayM154 = 14, DayM155 = 14, DayM156 = 14, DayM157 = 14, DayM158 = 14,
DayM159 = 14, DayM160 = 14, DayM161 = 14, DayM162 = 14, DayM163 = 14,
DayM164 = 14, DayM165 = 14, DayM166 = 14, DayM167 = 14, DayM168 = 14,
DayM169 = 14, DayM170 = 14, DayM171 = 14, DayM172 = 14, DayM173 = 14,
DayM174 = 14, DayM175 = 14, DayM176 = 14, DayM177 = 14, DayM178 = 14,
DayM179 = 14, DayM180 = 14, DayM181 = 14, DayM182 = 14, DayM183 = 14,
DayM184 = 14, DayM185 = 14, DayM186 = 14, DayM187 = 14, DayM188 = 14,
DayM189 = 14, DayM190 = 14, DayM191 = 14, DayM192 = 14, DayM193 = 14,
DayM194 = 14, DayM195 = 14, DayM196 = 14, DayM197 = 14, DayM198 = 14,
DayM199 = 14, DayM200 = 14, DayM201 = 14, DayM202 = 14, DayM203 = 14,
DayM204 = 14, DayM205 = 14, DayM206 = 14, DayM207 = 14, DayM208 = 14,
DayM209 = 14, DayM210 = 14, DayM211 = 14, DayM212 = 14, DayM213 = 14,
DayM214 = 14, DayM215 = 14, DayM216 = 14, DayM217 = 14, DayM218 = 14,
DayM219 = 14, DayM220 = 14, DayM221 = 14, DayM222 = 14, DayM223 = 14,
DayM224 = 14, DayM225 = 14, DayM226 = 14, DayM227 = 14, DayM228 = 14,
DayM229 = 14, DayM230 = 14, DayM231 = 14, DayM232 = 14, DayM233 = 14,
DayM234 = 14, DayM235 = 14, DayM236 = 14, DayM237 = 14, DayM238 = 14,
DayM239 = 14, DayM240 = 14, DayM241 = 14, DayM242 = 14, DayM243 = 14,
DayM244 = 14, DayM245 = 14, DayM246 = 14, DayM247 = 14, DayM248 = 14,
DayM249 = 14, DayM250 = 14, DayM251 = 14, DayM252 = 14, DayM253 = 14,
DayM254 = 14, DayM255 = 14, DayM256 = 14, DayM257 = 14, DayM258 = 14,
DayM259 = 14, DayM260 = 14, DayM261 = 14, DayM262 = 14, DayM263 = 14,
DayM264 = 14, DayM265 = 14, DayM266 = 14, DayM267 = 14, DayM268 = 14,
DayM269 = 14, DayM270 = 14, DayM271 = 14, DayM272 = 14, DayM273 = 14,
DayM274 = 14, DayM275 = 14, DayM276 = 14, DayM277 = 14, DayM278 = 14,
DayM279 = 14, DayM280 = 14, DayM281 = 14, DayM282 = 14, DayM283 = 14,
DayM284 = 14, DayM285 = 14, DayM286 = 14, DayM287 = 14, DayM288 = 14,
DayM289 = 14, DayM290 = 14, DayM291 = 14, DayM292 = 14, DayM293 = 14,
DayM294 = 14, DayM295 = 14, DayM296 = 14, DayM297 = 14, DayM298 = 14,
DayM299 = 14, DayM300 = 14, DayM301 = 14, DayM302 = 14, DayM303 = 14,
DayM304 = 14, DayM305 = 14, DayM306 = 14, DayM307 = 14, DayM308 = 14,
DayM309 = 14, DayM310 = 14, DayM311 = 14, DayM312 = 14, DayM313 = 14,
DayM314 = 14, DayM315 = 14, DayM316 = 14, DayM317 = 14, DayM318 = 14,
DayM319 = 14, DayM320 = 14, DayM321 = 14, DayM322 = 14, DayM323 = 14,
DayM324 = 14, DayM325 = 14, DayM326 = 14, DayM327 = 14, DayM328 = 14,
DayM329 = 14, DayM330 = 14, DayM331 = 14, DayM332 = 14, DayM333 = 14,
DayM334 = 14, DayM335 = 14, DayM336 = 14, DayM337 = 14, DayM338 = 14,
DayM339 = 14, DayM340 = 14, DayM341 = 14, DayM342 = 14, DayM343 = 14,
DayM344 = 14, DayM345 = 14, DayM346 = 14, DayM347 = 14, DayM348 = 14,
DayM349 = 14, DayM350 = 14, DayM351 = 14, DayM352 = 14, DayM353 = 14,
DayM354 = 14, DayM355 = 14, DayM356 = 14, DayM357 = 14, DayM358 = 14,
DayM359 = 14, DayM360 = 14, DayM361 = 14, DayM362 = 14, DayM363 = 14,
DayM364 = 14, DayM365 = 14, coef = 14, datedif = 0L), class = "data.frame", row.names = c(NA,
-1L))
df1<-as.data.table(df1)
Output2 <- df1[, .(coef, Result = fcoalesce(as.matrix(.SD)[cbind(.I, match(paste0('DayM', datedif), names(.SD)))], coef)), .SDcols = patterns("^DayM\\d ")]
> Output2
coef Result
1: 14 14
結果是coef - DayM= 14 - 1 = 13
不使用data.table
df1<-structure(list(Id = 8, date1 = structure(1649376000, tzone = "UTC", class = c("POSIXct",
"POSIXt")), date2 = structure(1649376000, tzone = "UTC", class = c("POSIXct",
"POSIXt")), Week = "Sexta-feira", DT = "0", Category = "PUBBAR",
GR = 1, DayR1 = 0, DayM000 = 13, DayM001 = 13,
DayM002 = 14, DayM003 = 14, DayM004 = 13, DayM005 = 13, DayM006 = 13,
DayM007 = 12, DayM008 = 12, DayM009 = 12, DayM010 = 12, DayM011 = 10,
DayM012 = 10, DayM013 = 10, DayM014 = 10, DayM015 = 10, DayM016 = 10,
DayM017 = 10, DayM018 = 10, DayM019 = 10, DayM020 = 8, DayM021 = 8,
DayM022 = 6, DayM023 = 6, DayM024 = 6, DayM025 = 6, DayM026 = 6,
DayM027 = 6, DayM028 = 6, DayM029 = 6, DayM030 = 6, DayM031 = 4,
DayM032 = 4, DayM033 = 4, DayM034 = 4, DayM035 = 4, DayM036 = 4,
DayM037 = 5, DayM038 = 5, DayM039 = 5, DayM040 = 5, DayM041 = 5,
DayM042 = 5, DayM043 = 5, DayM044 = 5, DayM045 = 5, DayM046 = 5,
DayM047 = 5, DayM048 = 5, DayM049 = 5, DayM050 = 4, DayM051 = 4,
DayM052 = 4, DayM053 = 4, DayM054 = 4, DayM055 = 4, DayM056 = 4,
DayM057 = 4, DayM058 = 4, DayM059 = 4, DayM060 = 4, DayM061 = 4,
DayM062 = 4, DayM063 = 4, DayM064 = 4, DayM065 = 4, DayM066 = 4,
DayM067 = 4, DayM068 = 4, DayM069 = 4, DayM070 = 4, DayM071 = 4,
DayM072 = 4, DayM073 = 4, DayM074 = 4, DayM075 = 4, DayM076 = 4,
DayM077 = 4, DayM078 = 4, DayM079 = 4, DayM080 = 4, DayM081 = 4,
DayM082 = 4, DayM083 = 4, DayM084 = 4, DayM085 = 4, DayM086 = 4,
DayM087 = 4, DayM088 = 4, DayM089 = 4, DayM090 = 4, DayM091 = 4,
DayM092 = 4, DayM093 = 4, DayM094 = 4, DayM095 = 4, DayM096 = 4,
DayM097 = 4, DayM098 = 4, DayM099 = 4, DayM100 = 4, DayM101 = 4,
DayM102 = 4, DayM103 = 4, DayM104 = 4, DayM105 = 4, DayM106 = 4,
DayM107 = 4, DayM108 = 4, DayM109 = 4, DayM110 = 4, DayM111 = 4,
DayM112 = 4, DayM113 = 4, DayM114 = 4, DayM115 = 4, DayM116 = 4,
DayM117 = 4, DayM118 = 4, DayM119 = 4, DayM120 = 4, DayM121 = 4,
DayM122 = 4, DayM123 = 4, DayM124 = 4, DayM125 = 4, DayM126 = 4,
DayM127 = 4, DayM128 = 4, DayM129 = 4, DayM130 = 4, DayM131 = 2,
DayM132 = 2, DayM133 = 2, DayM134 = 2, DayM135 = 2, DayM136 = 2,
DayM137 = 2, DayM138 = 2, DayM139 = 2, DayM140 = 2, DayM141 = 2,
DayM142 = 2, DayM143 = 2, DayM144 = 2, DayM145 = 1, DayM146 = 1,
DayM147 = 1, DayM148 = 1, DayM149 = 1, DayM150 = 1, DayM151 = 1,
DayM152 = 1, DayM153 = 0, DayM154 = 0, DayM155 = 0, DayM156 = 0,
DayM157 = 0, DayM158 = 0, DayM159 = 0, DayM160 = 0, DayM161 = 0,
DayM162 = 0, DayM163 = 0, DayM164 = 0, DayM165 = 0, DayM166 = 0,
DayM167 = 0, DayM168 = 0, DayM169 = 0, DayM170 = 0, DayM171 = 0,
DayM172 = 0, DayM173 = 0, DayM174 = 0, DayM175 = 0, DayM176 = 0,
DayM177 = 0, DayM178 = 0, DayM179 = 0, DayM180 = 0, DayM181 = 0,
DayM182 = 0, DayM183 = 0, DayM184 = 0, DayM185 = 0, DayM186 = 0,
DayM187 = 0, DayM188 = 0, DayM189 = 0, DayM190 = 0, DayM191 = 0,
DayM192 = 0, DayM193 = 0, DayM194 = 0, DayM195 = 0, DayM196 = 0,
DayM197 = 0, DayM198 = 0, DayM199 = 0, DayM200 = 0, DayM201 = 0,
DayM202 = 0, DayM203 = 0, DayM204 = 0, DayM205 = 0, DayM206 = 0,
DayM207 = 0, DayM208 = 0, DayM209 = 0, DayM210 = 0, DayM211 = 0,
DayM212 = 0, DayM213 = 0, DayM214 = 0, DayM215 = 0, DayM216 = 0,
DayM217 = 0, DayM218 = 0, DayM219 = 0, DayM220 = 0, DayM221 = 0,
DayM222 = 0, DayM223 = 0, DayM224 = 0, DayM225 = 0, DayM226 = 0,
DayM227 = 0, DayM228 = 0, DayM229 = 0, DayM230 = 0, DayM231 = 0,
DayM232 = 0, DayM233 = 0, DayM234 = 0, DayM235 = 0, DayM236 = 0,
DayM237 = 0, DayM238 = 0, DayM239 = 0, DayM240 = 0, DayM241 = 0,
DayM242 = 0, DayM243 = 0, DayM244 = 0, DayM245 = 0, DayM246 = 0,
DayM247 = 0, DayM248 = 0, DayM249 = 0, DayM250 = 0, DayM251 = 0,
DayM252 = 0, DayM253 = 0, DayM254 = 0, DayM255 = 0, DayM256 = 0,
DayM257 = 0, DayM258 = 0, DayM259 = 0, DayM260 = 0, DayM261 = 0,
DayM262 = 0, DayM263 = 0, DayM264 = 0, DayM265 = 0, DayM266 = 0,
DayM267 = 0, DayM268 = 0, DayM269 = 0, DayM270 = 0, DayM271 = 0,
DayM272 = 0, DayM273 = 0, DayM274 = 0, DayM275 = 0, DayM276 = 0,
DayM277 = 0, DayM278 = 0, DayM279 = 0, DayM280 = 0, DayM281 = 0,
DayM282 = 0, DayM283 = 0, DayM284 = 0, DayM285 = 0, DayM286 = 0,
DayM287 = 0, DayM288 = 0, DayM289 = 0, DayM290 = 0, DayM291 = 0,
DayM292 = 0, DayM293 = 0, DayM294 = 0, DayM295 = 0, DayM296 = 0,
DayM297 = 0, DayM298 = 0, DayM299 = 0, DayM300 = 0, DayM301 = 0,
DayM302 = 0, DayM303 = 0, DayM304 = 0, DayM305 = 0, DayM306 = 0,
DayM307 = 0, DayM308 = 0, DayM309 = 0, DayM310 = 0, DayM311 = 0,
DayM312 = 0, DayM313 = 0, DayM314 = 0, DayM315 = 0, DayM316 = 0,
DayM317 = 0, DayM318 = 0, DayM319 = 0, DayM320 = 0, DayM321 = 0,
DayM322 = 0, DayM323 = 0, DayM324 = 0, DayM325 = 0, DayM326 = 0,
DayM327 = 0, DayM328 = 0, DayM329 = 0, DayM330 = 0, DayM331 = 0,
DayM332 = 0, DayM333 = 0, DayM334 = 0, DayM335 = 0, DayM336 = 0,
DayM337 = 0, DayM338 = 0, DayM339 = 0, DayM340 = 0, DayM341 = 0,
DayM342 = 0, DayM343 = 0, DayM344 = 0, DayM345 = 0, DayM346 = 0,
DayM347 = 0, DayM348 = 0, DayM349 = 0, DayM350 = 0, DayM351 = 0,
DayM352 = 0, DayM353 = 0, DayM354 = 0, DayM355 = 0, DayM356 = 0,
DayM357 = 0, DayM358 = 0, DayM359 = 0, DayM360 = 0, DayM361 = 0,
DayM362 = 0, DayM363 = 0, DayM364 = 0, DayM365 = 0, coef = 14), class = "data.frame", row.names = c(NA,
-1L))
df1%>% mutate(across(starts_with("Day"), ~coef - .),
across(contains("date"), ymd),
datedif = parse_number(as.character(date2-date1)))%>%
rename_with(~str_replace(.,'(?<=[A-Z])0 (?=.)', ""), starts_with('Day')) %>%
rowwise %>%
mutate(Result= if (str_c('DayM', datedif) %in% names(.)) get(str_c('DayM', datedif)) else coef) %>%
ungroup() %>%
select(coef, Result)%>%data.frame()
coef Result
1 14 1
uj5u.com熱心網友回復:
使用data.table,我們可以指定.SDcols選擇“DR”列或“date_cols”并將輸出分配給那些,然后使用行/列索引來提取值以創建“結果”,而不是使用逐行匹配
library(data.table)
# get the column names that starts with DR
dr_names <- grep("^DR", names(df1), value = TRUE)
# get the columns that contains date as substring
date_names <- grep("date", names(df1), value = TRUE)
# setDT - converts the data.frame to data.table
# .SDcols - specify the dr_names, date_names, loop over those
# with lapply, apply the functions and assign (`:=`) back to
# same columns
setDT(df1)[, (dr_names) := lapply(.SD, function(x) coef - x), .SDcols = dr_names
][, (date_names) := lapply(.SD, as.IDate), .SDcols = date_names
][, datedif := date2 - date1]
# rename with setnames
setnames(df1, dr_names, sub("([A-Z])0 ", "\\1", dr_names))
# Extract the corresponding 'DRM' column based on the value from
# datediff and match it with the DRM column names
# using a row/column indexing
# return the Result and coef columns
Output2 <- df1[, .(coef, Result = as.matrix(.SD)[cbind(.I,
match(paste0('DRM', datedif), names(.SD)))]),
.SDcols = patterns("^DRM\\d ")]
Output2[is.na(Result), Result := coef]
-輸出
> Output2
coef Result
<num> <num>
1: 8 6
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460966.html
