R 将1个列表中的日期值更改为另一个列表中的第i个日期值

R 将1个列表中的日期值更改为另一个列表中的第i个日期值,r,lapply,R,Lapply,我有一系列的日期 daysList <- seq(as.Date('2016-12-29'),as.Date('2017-01-01'),by="days") 我尝试了大量的lappy、rep_len,甚至尝试了通过主要的days_递减循环,将[[I]][I]值分配给daysList[I]值,但我一无所获 像往常一样,我想我缺少一个lappy实现。基于您的输出,那么一种方法是用第一个日期替换所有递减日期,即 lapply(days_decrement, function(i)replac

我有一系列的日期

daysList <- seq(as.Date('2016-12-29'),as.Date('2017-01-01'),by="days")
我尝试了大量的lappy、rep_len,甚至尝试了通过主要的days_递减循环,将[[I]][I]值分配给daysList[I]值,但我一无所获


像往常一样,我想我缺少一个lappy实现。

基于您的输出,那么一种方法是用第一个日期替换所有递减日期,即

lapply(days_decrement, function(i)replace(i, i != i[1], i[1]))

#[[1]]
#[1] "2016-12-29" "2016-12-29" "2016-12-29" "2016-12-29"
#[[2]]
#[1] "2016-12-30" "2016-12-30" "2016-12-30"
#[[3]]
#[1] "2016-12-31" "2016-12-31"
#[[4]]
#[1] "2017-01-01"
但是,如果您只想直接从countList和daysList执行此操作

 Map(rep, daysList, lapply(countList, length)) 
 #or similarly Map(rep, daysList, lapply(days_decrement, length))

#[[1]]
#[1] "2016-12-29" "2016-12-29" "2016-12-29" "2016-12-29"
#[[2]]
#[1] "2016-12-30" "2016-12-30" "2016-12-30"
#[[3]]
#[1] "2016-12-31" "2016-12-31"
#[[4]]
#[1] "2017-01-01"

对于这类工作,您可以尝试使用purrr包和函数编程。map函数和它的朋友有点像Lappy,但它们在用法上更加一致和强大,并且管道的语法非常简洁。

你的意见 daysList[[1]] > [1] 1 2 3 4 > > [[2]] > [1] 2 3 4 > > [[3]] > [1] 3 4 > > [[4]] > [1] 4 天数减少% map2countList,~.x[.y] 日减量 > [[1]] > [1] 2016-12-29 2016-12-30 2016-12-31 2017-01-01 > > [[2]] > [1] 2016-12-30 2016-12-31 2017-01-01 > > [[3]] > [1] 2016-12-31 2017-01-01 > > [[4]] > [1] 2017-01-01 创建一个你要求的 日间检查[[1]] > [1] 2016-12-29 2016-12-29 2016-12-29 2016-12-29 > > [[2]] > [1] 2016-12-30 2016-12-30 2016-12-30 > > [[3]] > [1] 2016-12-31 2016-12-31 > > [[4]] > [1] 2017-01-01
你的意思是指类似于lapplydays\u减量,functionireplacei,i!=i[1],i[1]?嗯,也许它应该对整个列表索引重复第i个元素,我试图将代码放入循环中,但它返回NULL,argh!我现在一定已经在google上浏览了50个Lappy列表页面,循环代码如下。哦,那么你想要一个嵌套的列表,第一个元素是我上面的Lappy创建的列表吗?是的,我想是这样。这个?lapplydays\u减量,函数i lapplyseqlengthi,函数j replacei,i!=i[j],i[j]
>daysCopy
[[1]]
[1] "2016-12-29" "2016-12-29" "2016-12-29" "2016-12-29"
[[2]]
[1] "2016-12-30" "2016-12-30" "2016-12-30"
[[3]]
[1] "2016-12-31" "2016-12-31"
[[4]]
[1] "2017-01-01"
lapply(days_decrement, function(i)replace(i, i != i[1], i[1]))

#[[1]]
#[1] "2016-12-29" "2016-12-29" "2016-12-29" "2016-12-29"
#[[2]]
#[1] "2016-12-30" "2016-12-30" "2016-12-30"
#[[3]]
#[1] "2016-12-31" "2016-12-31"
#[[4]]
#[1] "2017-01-01"
 Map(rep, daysList, lapply(countList, length)) 
 #or similarly Map(rep, daysList, lapply(days_decrement, length))

#[[1]]
#[1] "2016-12-29" "2016-12-29" "2016-12-29" "2016-12-29"
#[[2]]
#[1] "2016-12-30" "2016-12-30" "2016-12-30"
#[[3]]
#[1] "2016-12-31" "2016-12-31"
#[[4]]
#[1] "2017-01-01"