Data.table向下移动一列并填充NA

时间:2019-06-11 15:48:45

标签: r data.table

我正在尝试将数据帧的一列向下移动1行。

我将角色转换为数据框

final_forecasting <- read.csv(textConnection(forecasts), col.names = c("date", "prediction"))

然后我尝试使用data.table包中的shift函数:

x <- setDF(shift(final_forecasting))[]

我只想将“预测”列下移一行。但是我似乎无法完成它。我还想使用fill函数将单个NA值填写为1

一次尝试x <- setDF(shift(final_forecasting["prediction"]))[]

数据:

forecasts <- c("2019-03-08 04:59:00,1", "2019-03-08 05:59:00,-1", "2019-03-08 06:59:00,-1", 
"2019-03-08 07:59:00,1", "2019-03-08 08:59:00,1", "2019-03-08 09:59:00,1", 
"2019-03-08 10:59:00,1", "2019-03-08 11:59:00,-1", "2019-03-08 12:59:00,1", 
"2019-03-08 13:59:00,1")

编辑:

另一种尝试:

x <- setDF(shift(final_forecasting, n = 1, fill = NA, type = "shift", give.names = TRUE))[]

2 个答案:

答案 0 :(得分:1)

如果我说对了,我认为您需要的是使用setDT

很好地定义您的数据。
library(data.table)
setDT(final_forecasting)

然后在所需的列中使用shift

final_forecasting[,.(date = shift(date),prediction = shift(prediction))]
                  date prediction
1:                <NA>         NA
2: 2019-03-08 05:59:00         -1
3: 2019-03-08 06:59:00         -1
4: 2019-03-08 07:59:00          1
5: 2019-03-08 08:59:00          1
6: 2019-03-08 09:59:00          1
7: 2019-03-08 10:59:00          1
8: 2019-03-08 11:59:00         -1
9: 2019-03-08 12:59:00          1

答案 1 :(得分:1)

library(data.table)
setDT(final_forecasting)
final_forecasting[, prediction := shift(prediction, fill = 1)]

#                   date prediction
# 1: 2019-03-08 05:59:00          1
# 2: 2019-03-08 06:59:00         -1
# 3: 2019-03-08 07:59:00         -1
# 4: 2019-03-08 08:59:00          1
# 5: 2019-03-08 09:59:00          1
# 6: 2019-03-08 10:59:00          1
# 7: 2019-03-08 11:59:00          1
# 8: 2019-03-08 12:59:00         -1
# 9: 2019-03-08 13:59:00          1

现在,如果要将数据转换回普通的data.frame,只需运行:

setDF(final_forecasting)

或者直接在基数R中执行

final_forecasting$prediction <- c(1L, final_forecasting$prediction[-1])

数据:

forecasts <- c("2019-03-08 04:59:00,1", "2019-03-08 05:59:00,-1", "2019-03-08 06:59:00,-1", 
"2019-03-08 07:59:00,1", "2019-03-08 08:59:00,1", "2019-03-08 09:59:00,1", 
"2019-03-08 10:59:00,1", "2019-03-08 11:59:00,-1", "2019-03-08 12:59:00,1", 
"2019-03-08 13:59:00,1")
final_forecasting <- read.csv(textConnection(forecasts), col.names = c("date", "prediction"))