使用R中的新列展开数据表的网格(或幂集)

时间:2018-05-25 22:46:53

标签: r matrix dplyr data.table tidyverse

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

  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上完成。它被修剪并直接对实际数据进行全功率设置将导致内存错误,并且由于存在大量列而且也很笨重。

2 个答案:

答案 0 :(得分: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 :(得分:1)

这是一种依赖于回收的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&#39>