R中循环的矢量化,用于创建不同长度的字符串
我创建了一个示例R脚本来显示我的问题:R中循环的矢量化,用于创建不同长度的字符串,r,vectorization,R,Vectorization,我创建了一个示例R脚本来显示我的问题: test.df <- data.frame(uid=c('x001','x002','x003'), start_date=c('2015-01-02','2015-03-05','2015-07-09'), end_date=c('2015-01-07','2015-03-07','2015-07-16'), stri
test.df <- data.frame(uid=c('x001','x002','x003'),
start_date=c('2015-01-02','2015-03-05','2015-07-09'),
end_date=c('2015-01-07','2015-03-07','2015-07-16'),
stringsAsFactors=FALSE)
test.df[,'start_date'] <- as.Date(test.df[,'start_date'])
test.df[,'end_date'] <- as.Date(test.df[,'end_date'])
for (loop in (1:nrow(test.df))) {
test.df[loop,'output'] <- paste(seq(test.df[loop,'start_date'],test.df[loop,'end_date'],by = 1),collapse=';')
}
现在
A部分
是固定的,但是有没有加快B部分
的速度?还是应该将A部分
和B部分
组合在一起?请告诉我数据。表对我来说是新的。我们可以将'test.df'转换为'data.table'(setDT(test.df)
),按'uid'分组,我们得到'start\u date'、'end\u date'的序列,并将元素粘贴在一起
library(data.table)
setDT(test.df)[,paste(seq(start_date, end_date, by = '1 day'), collapse=';') , uid]
更新
对于B部分,如果我们不粘贴,它是一个两列数据集
setDT(test.df)[,seq(start_date, end_date, by = '1 day') , uid]
以下是如何使用apply完成此操作
test.df <- data.frame(uid=c('x001','x002','x003'),
start_date=c('2015-01-02','2015-03-05','2015-07-09'),
end_date=c('2015-01-07','2015-03-07','2015-07-16'),
stringsAsFactors=FALSE)
test.df$output <- apply(test.df, 1, function(x) paste(seq(as.Date(x[2]), as.Date(x[3]), by = 1), collapse=';'))
test.df如果要按行获取序列,可以使用for
或其中一个应用函数。但是,它不会改变速度谢谢@akrun,我使用了dplyr
,是的,运行脚本需要一些时间,还有其他建议吗?最好使用data.table
。在dplyr
中,您可能需要do
,这仍然会比较慢。发布了一个解决方案。
test.df <- data.frame(uid=c('x001','x002','x003'),
start_date=c('2015-01-02','2015-03-05','2015-07-09'),
end_date=c('2015-01-07','2015-03-07','2015-07-16'),
stringsAsFactors=FALSE)
test.df$output <- apply(test.df, 1, function(x) paste(seq(as.Date(x[2]), as.Date(x[3]), by = 1), collapse=';'))