【问题标题】:Execute vector multiplication in one variable of a tibble在 tibble 的一个变量中执行向量乘法
【发布时间】:2021-02-23 18:29:21
【问题描述】:

我有一个这样的tibble,可以看成是纵向数据集

df <- tibble( T = rep(1:5,each=3), dens = rnorm(15,0,1) )
  

df,我希望得到一个新的3-by-5矩阵,这样第一列就是dens的值T=1;第二列是dens[T=1] dens[T=2] 的乘积,以此类推。

预期的输出是

 new_df <- cbind(df$dens[1:3], dff$dens[1:3]*df$dens[4:6],df$dens[1:3]*df$dens[4:6]*df$dens[7:9],
                  df$dens[1:3]*df$dens[4:6]*df$dens[7:9]*df$dens[10:12],df$dens[1:3]*df$dens[4:6]*df$dens[7:9]*df$dens[10:12]*df$dens[13:15])
  

如何在 tibble 中更有效地做到这一点?

【问题讨论】:

  • 感谢指出!

标签: r dplyr tidyverse purrr


【解决方案1】:

一种选择是通过'T'列的rowid进行分组,获取'dens'的cumprod并使用pivot_wider重塑为'wide'格式

library(dplyr)
library(tidyr)
library(data.table)
df %>%       
   group_by(rn = rowid(T)) %>% 
   mutate(dens = cumprod(dens)) %>%
   ungroup %>%
   pivot_wider(names_from = T, values_from = dens) %>%
   select(-rn)

-输出

# A tibble: 3 x 5
#    `1`   `2`    `3`    `4`    `5`
#  <dbl> <dbl>  <dbl>  <dbl>  <dbl>
#1  1.77 2.06   1.53   2.23  -4.41 
#2  1.96 0.414  0.522 -0.175  0.182
#3  1.57 3.18  -3.99  -4.59   6.64 

-检查 OP 的预期

cbind(df$dens[1:3], 
       df$dens[1:3]*df$dens[4:6],
       df$dens[1:3]*df$dens[4:6]*df$dens[7:9],
       df$dens[1:3]*df$dens[4:6]*df$dens[7:9]*df$dens[10:12],
       df$dens[1:3]*df$dens[4:6]*df$dens[7:9]*df$dens[10:12]*df$dens[13:15])
#         [,1]      [,2]       [,3]       [,4]       [,5]
#[1,] 1.773718 2.0604976  1.5309983  2.2307720 -4.4127195
#[2,] 1.961222 0.4142233  0.5222992 -0.1748975  0.1820611
#[3,] 1.571597 3.1822827 -3.9931628 -4.5932566  6.6440672

【讨论】:

  • 谢谢!在另一种情况下,如果我只想保留最后一列,是否只需将pivot_wider(names_from=T,values_from=dens)更改为select(`5`)
  • @tobinz 是的,您可以使用 select 和反引号来表示不寻常的列名
  • @tobinz 另外,如果您不需要所有其他列,请使用 prod 而不是 cumprod
【解决方案2】:

也许使用Reduce 的基本 R 选项会有所帮助

> do.call(cbind, Reduce("*", with(df, split(dens, T)), accumulate = TRUE))
           [,1]        [,2]        [,3]       [,4]        [,5]
[1,] -1.2667876 -1.52064920 -2.25924893 2.55495272 -4.02049920
[2,] -0.2854711 -0.23282226  0.08117526 0.01885956 -0.01893413
[3,]  0.2698863 -0.07630793  0.06976650 0.05718294 -0.10454398

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 2013-04-04
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多