Как я могу переместить столбцы столбцов в вложенном столбце? - PullRequest
2 голосов
/ 11 апреля 2019

У меня есть фрейм данных с большим количеством категорий.Для категории я вычисляю значение сдвига.С этим значением я хочу сместить каждый столбец этой части фрейма данных вниз на это значение.Для этого я подумал, что было бы полезно использовать «вложенный тибл», а затем использовать map функцию 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)))

Я хотел бы получить такой вывод:

# 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]>

, где каждый столбец «data.shift» имеетзапаздывание сдвига значений. Например, для первой строки необъявленный тиббл будет выглядеть так:

# 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

Есть ли способ сделать это, используя функцию purrr::map?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Мы также можем сделать это без анонимного вызова, если указать имя параметра

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)])) 
2 голосов
/ 11 апреля 2019

это то, что вы хотите?

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