当前位置:  开发笔记 > 编程语言 > 正文

在向量中向前传递元素的一部分(不循环)

如何解决《在向量中向前传递元素的一部分(不循环)》经验,为你挑选了1个好方法。



1> Rich Scriven..:

这里有几个选项.第一个使用包,第二个只使用基础R.

选项1:使用tidyr::separate()zoo::na.locf().要了解这里发生了什么,请阅读每个帮助文件.它基本上拆分空间上的列,然后在NAs 上向前传递先前的值.然后我们粘贴.

d$X1 <- with(
    tidyr::separate(d, X1, letters[1:2], " ", fill = "left"), 
    paste(zoo::na.locf(a), b)
)

选项2:仅使用基数R.这将查找日期,查找需要前缀的元素,并将必要的元素粘贴到时间上.通过查找日期和时间之间的空格找到日期.

g <- grepl(" ", d$X1, fixed = TRUE)
d$X1[!g] <- paste(
    rep(sub(" .*", "", d$X1[g]), with(rle(g), lengths[!values])), 
    d$X1[!g]
)

根据要求没有循环.这两个选项都提供了以下更新的数据框d.

d
#                   X1
# 1  Dec-17-15 05:17PM
# 2  Dec-17-15 04:46PM
# 3  Dec-17-15 04:44PM
# 4  Dec-17-15 04:40PM
# 5  Dec-17-15 04:39PM
# 6  Dec-16-15 10:37PM
# 7  Dec-16-15 07:48PM
# 8  Dec-16-15 07:41PM
# 9  Dec-16-15 06:35PM
# 10 Dec-16-15 06:09PM

注意: 选项2假定X1是一个字符列.如果X1是一个因素,您需要在选项2之前d$X1 <- as.character(d$X1).我们不需要关注选项1中的问题,因为tidyr::separate()我们会进行转换.

数据:

d <- structure(list(X1 = c("Dec-17-15 05:17PM", "04:46PM", "04:44PM", 
"04:40PM", "04:39PM", "Dec-16-15 10:37PM", "07:48PM", "07:41PM", 
"06:35PM", "06:09PM")), .Names = "X1", class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有