在R中的函数内循环

时间:2018-06-12 10:23:11

标签: r function loops if-statement

我想创建一个包含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}}

2 个答案:

答案 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)

}