如何在嵌套的小标题中移动小标题列?

时间:2019-04-11 15:11:26

标签: r dataframe dplyr purrr tibble

我有一个包含很多类别的数据框。对于类别,我计算一个移位值。使用此值,我想将数据帧此部分的每一列向下移动此值。为了执行此操作,我认为使用“嵌套小动作”然后使用map的{​​{1}}函数执行移位可能会很有用。

要人为地重现该问题,我将使用虹膜数据集创建这样的数据框:

purrr

我的意图是使用一个映射函数,该函数获取“数据”中各小节的小节并将其移动移位值。在代码中(它只是为了澄清而未运行:

df <- iris %>% group_by(Species) %>% 
  nest() %>% mutate(shift = as.integer(c(1, 2, 3)))

df

# A tibble: 3 x 3
  Species    data              shift
  <fct>      <list>            <int>
1 setosa     <tibble [50 x 4]>     1
2 versicolor <tibble [50 x 4]>     2
3 virginica  <tibble [50 x 4]>     3

我想要这样的输出:

df %>% mutate(data.shift = map(data, lag(.x, n = shift)))

其中“ data.shift”的每一列都有值偏移。例如,对于第一行,未嵌套的小标题如下所示:

# A tibble: 3 x 4
  Species    data              shift    data.shift
  <fct>      <list>            <int>    <list>
1 setosa     <tibble [50 x 4]>     1    <tibble[50 x 4]>
2 versicolor <tibble [50 x 4]>     2    <tibble[50 x 4]>
3 virginica  <tibble [50 x 4]>     3    <tibble[50 x 4]>

是否可以使用# A tibble: 50 x 4 Sepal.Length Sepal.Width Petal.Length Petal.Width <dbl> <dbl> <dbl> <dbl> 1 NA NA NA NA 2 5.10 3.50 1.40 0.200 3 4.90 3.00 1.40 0.200 4 4.70 3.20 1.30 0.200 5 4.60 3.10 1.50 0.200 6 5.00 3.60 1.40 0.200 7 5.40 3.90 1.70 0.400 8 4.60 3.40 1.40 0.300 9 5.00 3.40 1.50 0.200 10 4.40 2.90 1.40 0.200 # ... with 40 more rows 函数执行此操作?

2 个答案:

答案 0 :(得分:2)

这是你想要的吗?

df %>% mutate(data.shift = map2(data, shift, ~mutate_all(.x, function(z) lag(z, .y)))

答案 1 :(得分:2)

如果我们指定参数名称,我们也可以在不进行匿名调用的情况下执行此操作

df %>% 
    mutate(data.shift = map2(data, shift, ~ .x %>% 
                                               mutate_all(lag, n = .y))) 

或者使用data.table shift可以使data.table或data.frame移动

library(data.table)
df %>% 
   mutate(data.shift = map2(data, shift, ~  
          as.data.table(.x)[, (names(.x)) := shift(.SD, n = .y)]))