我有一个包含很多类别的数据框。对于类别,我计算一个移位值。使用此值,我想将数据帧此部分的每一列向下移动此值。为了执行此操作,我认为使用“嵌套小动作”然后使用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
函数执行此操作?
答案 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)]))