【问题标题】:Data.table to shift one column down and fill with NAData.table 向下移动一列并用 NA 填充
【发布时间】:2019-06-11 15:48:45
【问题描述】:

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

我将我的字符转换为数据框

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

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

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

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

一次尝试x &lt;- 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))[]

【问题讨论】:

  • 不确定,但dplyrlead()lag()(忘记哪个向上移v 向下)可能适用于移位部分..
  • 我知道其他一些功能,并且有过一两个类似的问题来移动某些列。我只是希望得到data.table 的方法。
  • 您可能想阅读文档和插图。 setDT(final_forecasting)[, final_forecasting := shift(prediction, fill=1)]

标签: r data.table


【解决方案1】:

如果我说得对,我认为你需要的只是用setDT很好地定义你的data.table

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

【讨论】:

  • 谢谢,差不多了,但我只是想将“预测”列向下移动并保持“日期”列不变。
  • final_forecasting[,.(date = date, prediction = shift(prediction))] 这样做了。
【解决方案2】:
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)

或者直接在base 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"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多