r - 如何移动嵌套 tibbles 中的 tibbles 列?

标签 r dataframe dplyr purrr tibble

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

为了人为地重现该问题,我将使用 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/

相关文章:

Python:尝试交叉应用两个数据框

r - 如何编写dplyr组以分隔文件?

r - 共现变量对的交叉制表

regex - 使用正则表达式提取R中特定长度的单词

将数据帧作为一个整体复制 n 次

R Markdown 模板创建

r - 使用与列名同名的全局变量过滤数据框

python-3.x - Pandas .agg() 转换为列表但跳过 nans

sql - Spark SQL查询与DataFrame函数

r - R中数据框中条件的单独列