如何在R中的if循环中将数据帧拆分为特定数量的行

如何在R中的if循环中将数据帧拆分为特定数量的行,r,R,我正在写一个功能,以发送电子邮件给我的客户在R。我使用mailR软件包这样做,但我的服务提供商只允许我发送100封电子邮件一小时。我想做的是,如果我的电子邮件列表包含270个电子邮件地址,我想将其分为chunk1=100、chunk2=100和chunk3=70,然后它应该向第一个chunk发送电子邮件,然后等待一个小时,然后是chunk2,依此类推。 这是我的函数看起来的样子 email <- function(dataframe,city,date){ dataframe$reg

我正在写一个功能,以发送电子邮件给我的客户在R。我使用mailR软件包这样做,但我的服务提供商只允许我发送100封电子邮件一小时。我想做的是,如果我的电子邮件列表包含270个电子邮件地址,我想将其分为
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]])}
}