【发布时间】:2015-01-04 05:11:26
【问题描述】:
您好,我对 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 是一个列表,但我不知道如何继续。
【问题讨论】:
-
可能类似于
st_complete_x_dt <- function(x) { res <- subset(st_complete, year(accept_d) == x); as.data.table(res) } -
您应该问自己为什么要创建这些子集,以及是否真的有必要将它们存储为单独的对象(可能不需要)。此外,您使用包 data.table,但不使用 data.table 操作/语法,这表明您还没有理解包(危险)并且没有充分发挥其潜力。
标签: r loops rstudio lapply data-cleaning