我有一个包含很多类别的数据框。对于一个类别,我计算一个移动值。使用这个值,我想将数据框这部分的每一列向下移动这个值。为了执行此操作,我认为使用“嵌套 tibble”然后使用 purrr
的 map
函数来执行移位可能会很有用。
为了人为地重现该问题,我将使用 iris 数据集创建这样一个数据框:
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
函数来执行此操作?
最佳答案
如果我们指定参数名称,我们也可以在不匿名调用的情况下执行此操作
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)]))
关于r - 如何移动嵌套 tibbles 中的 tibbles 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55635833/