我想创建一个包含ifelse语句的函数,如下所示:
df$Arrears_L1M<-ArrearsL1M("col_201823","col_201822","col_201821","col_201820")
然后我有这个:
col_201823 col_201822 col_201821 col_201820 col_201819 col_201818 col_201817 col_201816 col_201815
1 99 5 4 2 99 99 99 99 99
2 3 0 3 2 3 3 3 3 3
3 2 2 2 2 2 2 2 2 2
4 0 0 0 1 0 0 0 0 0
5 99 99 5 99 99 99 99 99 99
6 2 1 4 99 2 2 2 2 2
7 1 1 99 99 1 1 1 1 1
以下是数据示例:
col_201823<-c(99,3,2,0,99,2,1)
col_201822<-c(5,0,2,0,99,1,1)
col_201821<-c(4,3,2,0,5,4,99)
col_201820<-c(2,2,2,1,99,99,99)
col_201819<-c(99,3,2,0,99,2,1)
col_201818<-c(99,3,2,0,99,2,1)
col_201817<-c(99,3,2,0,99,2,1)
col_201816<-c(99,3,2,0,99,2,1)
col_201815<-c(99,3,2,0,99,2,1)
test<-as.data.frame(cbind(col_201823,col_201822,col_201821,col_201820,col_201819,col_201818,col_201817,col_201816,col_201815))
因此,代码将检查从最近的(即2018年第23周,第22周,第21周和第20周)开始的前4周数据。
开始的一周可以改变,我想让这个工作,以便我进入第一周,它运行过去4周的功能。 我只想进入第一周,所以只输入一个。因此,如果我输入col_201820,我将得到几周col_201820,col_201819,col_201818和col_201817的答案。
我想在某个时间点运行52周的数据(即一年),所以如果开始的一周发生变化,我试图让它更容易改变。 如果首周是201801,还需要201752,2017751,201750。
我不确定从哪里开始,所以不能告诉你我已经尝试过的任何事情。
**可重复示例的代码
{{1}}
答案 0 :(得分:4)
我想你想知道如何从一周开始创建一周的向量。例如
weeks_from_start <- function(x) {
week <- as.integer(substring(x, nchar(x) - 1))
rest <- substring(x, 1, nchar(x) - 2)
paste0(rest, seq(week, by = -1, length.out=4))
}
所以
> weeks_from_start("col_201823")
[1] "col_201823" "col_201822" "col_201821" "col_201820"
在ArrearsL1M()
功能的顶部使用此功能。我会将其实现为
ArrearsL1M <- function(df, last_week) {
weeks <- weeks_from_start(last_week)
m <- as.matrix(df[, weeks])
m[] <- m %in% 1:5 # test all elements in 1 call; format as matrix
rowSums(m) != 0
}
对于更复杂的解析,请将weeks_from_start()
修改为
week0 <- as.integer(substring(x, nchar(x) - 1))
year0 <- as.integer(substring(x, 5, 8))
week0 <- seq(week0, by = -1, length.out = 4)
week <- (week0 - 1) %% 52 + 1
year <- year0 - cumsum(week0 == 0)
sprintf("col_%4d%.2d", year, week)
可能这接近'黑客',例如,所有年份都有52周?从周二开始的一年,也就是星期一,星期一,星期日,上一周的第52周?是时候重新考虑如何表示这些数据......
答案 1 :(得分:0)
ArrearsL1M <- function(input1, input2, input3, input4){
cols <- c(input1, input2, input3, input4)
output <- as.numeric(apply(apply(df[, cols], 2, function(x) x %in% 1:5), 1, any))
return(output)
}
有1个输入:
ArrearsL1M <- function(cols){
output <- as.numeric(apply(apply(df[, cols], 2, function(x) x %in% 1:5), 1, any))
return(output)
}