我想在data.table中的变量子集上应用函数.在这种情况下,我只是改变变量类型.我可以在data.table中以几种不同的方式执行此操作,但是我正在寻找一种不需要中间分配的方法(mycols在此示例中),并且不需要我指定要更改两次的列.这是一个简化的可重现的例子:
library('data.table')
n<-30
dt <- data.table(a=sample(1:5, n, replace=T),
b=as.character(sample(seq(as.Date('2011-01-01'), as.Date('2015-01-01'), length.out=n))),
c1235=as.character(sample(seq(as.Date('2012-01-01'), as.Date('2013-01-01'), length.out=n))),
d7777=as.character(sample(seq(as.Date('2012-01-01'), as.Date('2013-01-01'), length.out=n)))
)
Run Code Online (Sandbox Code Playgroud)
方式1:这有效......但它是硬编码的
mycols <- c('b', 'c1235', 'd7777')
dt1 <- dt[,(mycols):=lapply(.SD, as.Date), .SDcols=mycols]
Run Code Online (Sandbox Code Playgroud)
方式2:这有效...但我需要创建一个中间对象让它工作(mycols)
mycols <- which(sapply(dt, class)=='character')
dt2 <- dt[,(mycols):=lapply(.SD, as.Date), .SDcols=mycols]
Run Code Online (Sandbox Code Playgroud)
方式3:这有效,但我需要两次指定这个长表达式
dt3 <- dt[,(which(sapply(dt, class)=='character')):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]
Run Code Online (Sandbox Code Playgroud)
方式4:这不起作用,但我想要这样的东西,只允许我指定.SDcols一次变量.我正在寻找一些方法来取代有用(.SD):=的东西......或者把东西连在一起.真的,我很想知道是否有人有一个方法来执行在WAY 1,2,3中完成的操作,而没有指定一个膨胀环境并且不需要两次指定相同列的中间分配.
dt3 <- dt[,(.SD):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]
Run Code Online (Sandbox Code Playgroud) 我喜欢knitr& rmarkdown,但我经常发现自己有一份很长的报告,需要花费一些不小的时间来运行。生成后,我注意到文本中不可避免的拼写错误。然而,重新编织所有内容只是为了修复几个拼写错误(只是文本中的错误,而不是代码中的错误)需要很长时间,而且似乎是可以避免的。我正准备开始尝试开发自己的解决方案,但我认为这种事情已经有一个成熟的解决方案,可能比我构建的解决方案更强大。
我想知道是否有内部knitr或第三方的解决方案允许我只编辑报告的文本而无需重新运行代码、生成绘图和输出等。我知道,我可以简单地编辑生成的 html 文本,但是然后这些更改必须在生成它的 R/Rmd 代码中复制,否则它们会不同步。我正在设想这样的功能:
我cache有时会针对大型数据集使用该选项。如果我只是处理报告的文本,我会在开发时切换eval和关闭。echo然而,我正在寻找一个可以为我处理所有这些问题的函数,这样就不必弄乱代码和块选项来对文本进行小的编辑。