嗨,我对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
是一个列表,但我不确定如何继续。
答案 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))