我有一个带日期和时间的向量。向量的一些元素包括实际日期(+时间)以及它下面的任何时间是它各自的时间。我希望在第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
答案 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"))