让我们使用这些数字作为示例,因为我不能共享实际数据end=c(1,3,6,NA,6,7,8,NA,12,23,NA)。我需要将其转换为end=c(6,6,6,NA,8,8,8,NA,23,23,NA)。
`repeat{
end[k]=end[k+1]
k=k+1
if(is.na(end[k+1]) | k==length(end)){
break
}
}`
我已经尝试了这个作为第一步,但我被困在如何循环通过这个,而最终跳过NA。我已经尝试添加这个循环的方法,但它没有给予我想要的输出。
`j=1
while (j <= length(end)){
k <- j
repeat{
end[k]=end[k+1]
k=k+1
if(is.na(end[k+1]) | k==length(end)){
break
}
}
j=j+1
}`
有没有人知道如何循环通过这些数字,而暂时停止循环在一个NA和转换的最后一个数字之前的NA所有以前的数字。
4条答案
按热度按时间vom3gejh1#
溶液
将NA之间的值替换为每个NA之前的值。这是最快的解决方案(查看基准测试)。
如果
end
没有以NA结尾,解决方案将无法工作。因此为了安全起见,您可以这样修改它:虽然速度稍微慢了一点,但它仍然是最快的解决方案。
FOR循环解决方案
为了帮助你,我在这里留下一个循环的解决方案,你从结尾到开头,当你得到,你用以前的非NA值替换任何NA值。
基准
在这个例子中,
napos
方法是目前为止最快的方法。我也冒昧地与其他解决方案进行了比较。创建于2023-03-21带有reprex v2.0.2
q43xntqr2#
使用基数R,我们可以使用
cumsum
和is.na
来定义一个“组”或一组值。然后我们可以使用ave()
来转换这些组中的值,只保留最后一个值并保留NA值。这将返回所需的结果,而无需显式循环。
83qze16e3#
@MrFlick的答案可能是:
des4xlb04#
使用dplyr的一个想法。首先创建组,然后使用它们来提取所需的数字。