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

我创建了一个示例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'),
                      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=';'))