我应该为这些命令循环或创建一个函数吗?

时间:2015-01-04 05:11:27

标签: r loops rstudio lapply data-cleansing

嗨,我对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)`

所以我认为从第3行开始的所有其他行(st_complete_XX_dt,其中XX是2位数年份)可以放入循环中。所以我试过了:

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 个答案:

答案 0 :(得分:0)

我会尝试

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