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

时间:2015-12-18 01:12:31

标签: r

我有一个带日期和时间的向量。向量的一些元素包括实际日期(+时间)以及它下面的任何时间是它各自的时间。我希望在第1行的第12行至第17-15行填写第2/3/4/5行,同时保留这些行中的原始时间。同样,我希望第6行中的日期延伸到7/8/9/10。有没有办法在没有循环的情况下做到这一点?我很感激您的帮助

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

1 个答案:

答案 0 :(得分:7)

以下是几个选项。第一个使用包,第二个使用包。

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

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"))