【问题标题】:Should I loop or create a function for these commands?我应该为这些命令循环还是创建一个函数?
【发布时间】: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 &lt;- function(x) { res &lt;- subset(st_complete, year(accept_d) == x); as.data.table(res) }
  • 您应该问自己为什么要创建这些子集,以及是否真的有必要将它们存储为单独的对象(可能不需要)。此外,您使用包 data.table,但不使用 data.table 操作/语法,这表明您还没有理解包(危险)并且没有充分发挥其潜力。

标签: r loops rstudio lapply data-cleaning


【解决方案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))

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 2019-07-15
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2014-09-25
    相关资源
    最近更新 更多