【问题标题】:Expand grid (or power set) of a data table with new columns in R使用 R 中的新列扩展数据表的网格(或幂集)
【发布时间】:2018-05-25 22:46:52
【问题描述】:

我有一个我精心构建的数据表(下面提供了玩具示例):

  library(data.table)
     Vmat1 = data.table(expand.grid(c(list(d = 1:2, w = 1:(3)))))

> Vmat1
   d w
1: 1 1
2: 2 1
3: 1 2
4: 2 2
5: 1 3
6: 2 3

我想从以下意义上获得权力。对于 Vmat 的每一列,我想创建一个新的同名列,后缀为“prime”。然后我想枚举幂集,使得对于原始数据中的每个原始行,都有一个包含所有可能性的新行(与问题无关,但您可能能够正确想象我正在尝试处理状态转换在马尔可夫链中)

这将给出以下输出:

    d w dprime wprime
 1: 1 1      1      1
 2: 2 1      1      1
 3: 1 2      1      1
 4: 2 2      1      1
 5: 1 3      1      1
 6: 2 3      1      1
 7: 1 1      2      1
 8: 2 1      2      1
 9: 1 2      2      1
10: 2 2      2      1
11: 1 3      2      1
12: 2 3      2      1
13: 1 1      1      2
14: 2 1      1      2
15: 1 2      1      2
16: 2 2      1      2
17: 1 3      1      2
18: 2 3      1      2
19: 1 1      2      2
20: 2 1      2      2
21: 1 2      2      2
22: 2 2      2      2
23: 1 3      2      2
24: 2 3      2      2
25: 1 1      1      3
26: 2 1      1      3
27: 1 2      1      3
28: 2 2      1      3
29: 1 3      1      3
30: 2 3      1      3
31: 1 1      2      3
32: 2 1      2      3
33: 1 2      2      3
34: 2 2      2      3
35: 1 3      2      3
36: 2 3      2      3

请注意,在没有 Vmat 的情况下直接构造素数矩阵的解决方法在我的上下文中没有用。操作必须直接在 Vmat 上完成。它被修剪并且直接在实际数据上执行完整的功率集将导致内存错误并且由于存在大量列而也很笨重。

【问题讨论】:

    标签: r matrix dplyr data.table tidyverse


    【解决方案1】:

    tidyverse 方法:

    Vmat1 = data.frame(expand.grid(c(list(d = 1:2, w = 1:3))))
    
    library(tidyverse)
    
    Vmat1 %>%
      mutate(list(.)) %>%       # for every row add the same whole dataframe as a list
      unnest() %>%              # unnest the nested new column
      setNames(gsub("1", "prime", names(.)))  # update names
    

    这将解决名称问题

    Vmat1 = data.frame(expand.grid(c(list(d = 1:2, w = 1:3))))
    Vmat2 = Vmat1
    names(Vmat2) = paste0(names(Vmat1), "prime")
    
    library(tidyverse)
    
    Vmat1 %>%
      mutate(list(d=Vmat2)) %>%   # for every row add the same dataframe (updated names) as a list
      unnest()                    # unnest the nested new column
    

    【讨论】:

    • 顺便说一句,有些列名中已经有 1 了,是否有可能让它只 gsubs 结尾,或者它不使用 1 来附加?
    • 否则会破坏列名
    【解决方案2】:

    这是一个依赖于回收的 data.table 方法:

    NewMat <- Vmat1[ , list(d=d,w=w, dprime=rep(d, each=6), wprime=rep(w, each=6))]
    
    > str(NewMat)
    Classes ‘data.table’ and 'data.frame':  36 obs. of  4 variables:
     $ d     : int  1 2 1 2 1 2 1 2 1 2 ...
     $ w     : int  1 1 2 2 3 3 1 1 2 2 ...
     $ dprime: int  1 1 1 1 1 1 2 2 2 2 ...
     $ wprime: int  1 1 1 1 1 1 1 1 1 1 ...
     - attr(*, ".internal.selfref")=<externalptr> 
    

    概括用 nrow(Vmat1) 代替 6

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      相关资源
      最近更新 更多