Должен ли я цикл или создать функцию для этих команд?

Привет, я довольно новичок в очистке данных в R, но очень хорошо знаком с этим в Stata, и я использую RStudio для очистки некоторых данных. Я ищу способ сократить объем кода, который я использую, и я думаю, что способ сделать это будет создать цикл.

Изначально у меня есть:

st_complete$accept_d <- as.Date(as.character(st_complete$accept_d), "%Y-%m-%d")
st_complete_07 <- subset(st_complete, accept_d < as.Date("2008-01-01") )
st_complete_07_dt <- as.data.table(st_complete_07)
st_complete_08 <- subset(st_complete, (accept_d < as.Date("2009-01-01") & 
                    accept_d >= as.Date("2008-01-01") ))
st_complete_08_dt <- as.data.table(st_complete_08)
st_complete_09 <- subset(st_complete, (accept_d < as.Date("2010-01-01") & 
 accept_d >= as.Date("2009-01-01") ))
st_complete_09_dt <- as.data.table(st_complete_09)
st_complete_10 <- subset(st_complete, (accept_d < as.Date("2011-01-01") & 
          accept_d >= as.Date("2010-01-01") ))
st_complete_10_dt <- as.data.table(st_complete_10)
st_complete_11 <- subset(st_complete, (accept_d < as.Date("2012-01-01") &
        accept_d >= as.Date("2011-01-01") ))
st_complete_11_dt <- as.data.table(st_complete_11)`

Вот и думаю каждая вторая строчка (st_complete_XX_dt где XX - двузначный год), начиная со строки 3, можно поместить в цикл. Итак, я попробовал:

st_complete_yr <- list("st_complete_07", "st_complete_08", "st_complete_09", 
    "st_complete_10", "st_complete_11")`

for (i in str_complete_yr){
  dt_$i <- as.data.table($i)  
}

Но это не работает.. Я думаю, что мне нужно использовать lapply, так как st_complete_yr это список, но я не уверен, что делать дальше.

1 ответ

Я бы попробовал

library(data.table)
dates <- seq(as.Date('2008-01-01'), length.out=5, by='1 year')
st_complete_07_dt <- setDT(subset(st_complete, accept_d < 
                                       as.Date("2008-01-01")))
lst <- Map( function(x,y) setDT(subset(st_complete, 
     accept_d < y & accept_d >= x)),dates[-length(dates)], dates[-1])
lst <- c(list(st_complete_07_dt), lst)

names(lst) <- sprintf('st_complete_%02d_dt', 7:11)
list2env(lst, envir=.GlobalEnv)

head(st_complete_08_dt,2)
#    accept_d        Col2
#1: 2008-08-08 -0.02063172
#2: 2008-03-25 -0.90366751

Или вы могли бы сделать

st_complete_dt <- as.data.table(st_complete)
setkey(st_complete_dt, accept_d)
lstN <- st_complete_dt[,year:=format(accept_d, '%Y')][year<2008,
                  year:='<2008'][, list(list(.SD)), by=year]$V1
names(lstN) <- sprintf('st_complete_%02d_dt', 7:11)
list2env(lstN, envir=.GlobalEnv)
#<environment: R_GlobalEnv>
head(st_complete_08_dt,2)

данные

set.seed(24)
st_complete <- data.frame(accept_d = sample(seq(as.Date('2007-01-01'), 
          length.out=2000, by='1 day'), 400, replace=FALSE), Col2=rnorm(400))
Другие вопросы по тегам