如何在R中的if循环中将数据帧拆分为特定数量的行
我正在写一个功能,以发送电子邮件给我的客户在R。我使用mailR软件包这样做,但我的服务提供商只允许我发送100封电子邮件一小时。我想做的是,如果我的电子邮件列表包含270个电子邮件地址,我想将其分为如何在R中的if循环中将数据帧拆分为特定数量的行,r,R,我正在写一个功能,以发送电子邮件给我的客户在R。我使用mailR软件包这样做,但我的服务提供商只允许我发送100封电子邮件一小时。我想做的是,如果我的电子邮件列表包含270个电子邮件地址,我想将其分为chunk1=100、chunk2=100和chunk3=70,然后它应该向第一个chunk发送电子邮件,然后等待一个小时,然后是chunk2,依此类推。 这是我的函数看起来的样子 email <- function(dataframe,city,date){ dataframe$reg
chunk1=100、chunk2=100和chunk3=70
,然后它应该向第一个chunk发送电子邮件,然后等待一个小时,然后是chunk2,依此类推。
这是我的函数看起来的样子
email <- function(dataframe,city,date){
dataframe$registrant_email <- tolower(dataframe$registrant_email)
dataframe_city <- dataframe[dataframe$registrant_city == city & dataframe$create_date == date, ]
# Removing NA's and blank email ids
dataframe_city <- dataframe_city[!(is.na(dataframe_city$registrant_email)|dataframe_city$registrant_email==""), ]
# Removing duplicate email ids
dataframe_city <-dataframe_city[!duplicated(dataframe_city$registrant_email),]
emails <- as.vector(dataframe_city$registrant_email)
if(length(emails) > 100){
# divide the vector into chunks of 100
} else{send_email(emails}
return(emails)
}
email您可以将您的电子邮件向量拆分为一行列表:
mailinglist <- split(emails, ceiling(seq_along(emails)/100))
我用一个简单的mean()
调用测试了这个循环,它成功了,但是你应该用更少的时间自己测试它,并向自己发送邮件
编辑:要省略上一次迭代的延迟,请使用以下命令:
for(i in 1:length(mailinglist)) {
if(i < length(mailinglist)) {
send_email(mailinglist[[i]])
Sys.sleep(3600)}
else {
send_email(mailinglist[[i]])}
}
for(1中的i:长度(邮件列表)){
如果(i<长度(邮件列表)){
发送电子邮件(邮件列表[[i]])
系统睡眠(3600)}
否则{
发送(邮件列表[[i]])电子邮件}
}
若要在列表中将向量拆分为多个块,您可以使用类似于x的方法使用%/%
非常好,您应该将其添加为答案。您能用我的一行代码解释一下区别吗?输出似乎是一样的。这能解释一些特殊情况吗?这是个好主意。也许OP可以这样构建for循环:Sys.sleep
不会发生在最后一次循环迭代中(在没有必要的情况下)。如果您愿意,您也可以将我的split
注释和%/%
添加到您的答案中,如何构建for循环,以便Sys.sleep
不会发生在上一次循环迭代中我问到,您能解释一下我们的一行程序之间的区别吗?输出似乎是一样的,我的不解释什么?@docendodiscimus你能告诉我如何避免最后一个for循环中的sys.sleep
。@Neil,在分割之后和循环之前,你可以检查mailinglist
的长度,然后在循环内部,检查你当前的迭代是否是最后一个(等于列表的长度)并且仅当它未被调用时,例如调用Sys.sleep
for(i in 1:length(mailinglist)) {
if(i < length(mailinglist)) {
send_email(mailinglist[[i]])
Sys.sleep(3600)}
else {
send_email(mailinglist[[i]])}
}