6

我的excel数据文件的格式是:

 day                 value
 01-01-2000 00:00:00    4
 01-01-2000 00:01:00    3
 01-01-2000 00:02:00    1
 01-01-2000 00:04:00    1

我用这个打开我的文件:

ts = read.csv(file=pathfile, header=TRUE, sep=",")

如何将“值”列中编号为零的其他行添加到数据框中。输出示例:

 day                  value
 01-01-2000 00:00:00    4
 01-01-2000 00:01:00    3
 01-01-2000 00:02:00    1
 01-01-2000 00:03:00    0
 01-01-2000 00:04:00    1
4

4 回答 4

11

padr现在,这在包中是完全自动化的。只需要一行代码。

original <- data.frame(
  day = as.POSIXct(c("01-01-2000 00:00:00",
                     "01-01-2000 00:01:00",
                     "01-01-2000 00:02:00",
                     "01-01-2000 00:04:00"), format="%m-%d-%Y %H:%M:%S"),
  value = c(4, 3, 1, 1))

library(padr)
library(dplyr) # for the pipe operator
original %>% pad %>% fill_by_value(value)

请参阅vignette("padr")博客文章了解其工作原理。

于 2017-01-20T15:37:43.667 回答
3

我认为这是一个更通用的解决方案,它依赖于创建所有时间戳的序列,将其用作新数据框的基础,然后在适用的 df 中填写原始值。

# convert original `day` to POSIX
ts$day <- as.POSIXct(ts$day, format="%m-%d-%Y %H:%M:%S", tz="GMT")

# generate a sequence of all minutes in a day
minAsNumeric <- 946684860 + seq(0,60*60*24,by=60) # all minutes of your first day
minAsPOSIX <- as.POSIXct(minAsNumeric, origin="1970-01-01", tz="GMT") # convert those minutes to POSIX

# build complete dataframe
newdata <- as.data.frame(minAsPOSIX)
newdata$value <- ts$value[pmatch(newdata$minAsPOSIX, ts$day)] # fill in original `value`s where present
newdata$value[is.na(newdata$value)] <- 0 # replace NAs with 0
于 2013-05-24T22:49:50.650 回答
1

尝试:

ts = read.csv(file=pathfile, header=TRUE, sep=",", stringsAsFactors=F)
ts.tmp = rbind(ts,list("01-01-2000 00:03:00",0))
ts.out = ts.tmp[order(ts.tmp$day),]

请注意,您需要将第一列中的字符串强制加载为字符而不是因素,否则您将遇到 rbind 问题。要使日期列成为一个因素,而不是仅仅这样做:

ts.out$day = as.factor(ts.out$day)
于 2013-05-24T20:16:00.767 回答
0

Tidyr 提供了很好的complete功能来为隐式丢失的数据生成行。我在第二步中使用 replace_na 将 NA 值变为 0。

ts%>%
  tidyr::complete(day=seq.POSIXt(min(day), max(day), by="min"))%>%
  dplyr::mutate(value=tidyr::replace_na(value,0))

请注意,我将日期的粒度设置为分钟,因为您的数据集每分钟需要一行。

于 2022-02-03T08:43:42.957 回答