【问题标题】:Shift a column in R在 R 中移动一列
【发布时间】:2021-12-26 06:00:03
【问题描述】:

假设我有一个如下数据框:

library(tidyverse)

df <- tibble(x = c(1,2,3), y = c(4,5,6))

# A tibble: 3 x 2
      x     y
  <dbl> <dbl>
1     1     4
2     2     5
3     3     6

我想移动一列,添加一列,例如:

# A tibble: 3 x 3
      x     y shifted_x
  <dbl> <dbl>     <dbl>
1     1     4        NA
2     2     5         1
3     3     6         2

基本上,我想使用时间序列,所以我想获取以前的值并将它们用作特征。在python 我知道我能做到:

for i in range(1,11):
    df[f'feature_{i}']=df['sepal_length'].shift(i)

其中df 是pandas 数据框。 在R 中执行此操作的任何等效代码?

【问题讨论】:

  • 在`data.table`setDT(df)[, shifted_x := shift(x)]dplyrdf &lt;- df %&gt;% mutate(shifted_x = lag(x))或shift中有lag
  • 在 python 中你不使用 for 循环。 df['shifted_x'] = df.sepal_length.shift() 完美运行。在 R 中,看看下面给出的答案。

标签: r tidyverse


【解决方案1】:

R tidyverse 中的等价物是 dplyr::lag。在 mutate 中创建列并通过将 (&lt;-) 分配回同一对象“df”来更新对象

library(dplyr)
df <- df %>%
    mutate(shifted_x = lag(x))

或者如果我们需要使用shift,在data.table中有shift

library(data.table)
setDT(df)[, shifted_x := shift(x)]

另外,如果我们需要创建多个列,shift 可以在n 中获取值向量

setDT(df)[, paste0('shifted', 1:3) := shift(x, n = 1:3)]

【讨论】:

    【解决方案2】:

    我们还可以使用collapse 包中的flag 函数。

    library(collapse)
    
    df %>%
      ftransform(shifted_x = flag(x))
    # # A tibble: 3 x 3
    #       x     y shifted_x
    # * <dbl> <dbl>     <dbl>
    # 1     1     4        NA
    # 2     2     5         1
    # 3     3     6         2
    

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2020-07-02
      • 2016-07-23
      • 1970-01-01
      相关资源
      最近更新 更多