我有一个我精心构建的数据表(下面提供的玩具示例):
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上完成。它被修剪并直接对实际数据进行全功率设置将导致内存错误,并且由于存在大量列而且也很笨重。
答案 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>