这里有几个选项.第一个使用包,第二个只使用基础R.
选项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"))