2014-02-28 100 views
0

假設存在以下情況。有兩個表格,每個表格都有不同質量的數據。它們都具有相同的變量A,B和C.第一個表中的變量稱爲A1,B1和C2,而第二個表中的變量稱爲A2,B2和C2。創建兩個向量的組合

第一個表格可以用第二個表格更新。有六種可能的組合:

A1,B1,C2

A1,B2,C1

A2,B1,C1

A1,B2,C2

A2,B1, C2

A2,B2,C1

問題是如何在R中得到這個結果。我使用的是什麼如下:

require(utils) 
require(stringr) 

vars <- c("A1", "B1", "C1", "A2", "B2", "C2") 

combine <- function(data, n){ 
    com1 = combn(data, n)# make all combinations 
    com2 = c(str_sub(com1, end=-2L))# remove the number in the end of the name 
    com3 = matrix(com2, nrow = dim(com1)[1], ncol = dim(com1)[2])# vector to matrix 
    com3 = split(com3, rep(1:ncol(com3), each = nrow(com3)))# matrix to list 
    com3 = lapply(com3, duplicated)# find list elements with duplicated names 
    com3 = lapply(com3, function(X){X[which(!any(X == TRUE))]})# identify duplicated names 
    pos = which(as.numeric(com3) == 0)# get position of duplicates 
    com3 = com1[,pos]# return elements from the original list 
    com3 = split(com3, rep(1:ncol(com3), each = nrow(com3)))# matrix to list 
    com3 = lapply(com3, sort)# sort by alphabetical order 
    com3 = as.data.frame(com3, stringsAsFactors = FALSE)# matrix to data frame 
    res = list(positions = pos, combinations = com3)# return position and combinations 
    return(res) 
} 
combine(vars, 3) 

$positions 
[1] 1 4 6 10 11 15 17 20 

$combinations 
    X1 X2 X3 X4 X5 X6 X7 X8 
1 A1 A1 A1 A1 A2 A2 A2 A2 
2 B1 B1 B2 B2 B1 B1 B2 B2 
3 C1 C2 C1 C2 C1 C2 C1 C2 

我想知道,如果有人知道不是創造所有可能的組合和事後清理結果作爲我的函數做了一個更簡單的解決方案。

回答

2

你在想這個問題。只需使用expand.grid

> expand.grid(c('A1','A2'),c('B1','B2'),c('C1','C2')) 
    Var1 Var2 Var3 
1 A1 B1 C1 
2 A2 B1 C1 
3 A1 B2 C1 
4 A2 B2 C1 
5 A1 B1 C2 
6 A2 B1 C2 
7 A1 B2 C2 
8 A2 B2 C2 
+0

不錯。我用'expand.grid'欺騙了45分鐘試圖獲得這個。乾杯! –

+0

這是一種可能性。但是如何將字符作爲字符返回?請注意'expand.grid'返回因子。 –

+0

@Alessandro在'expand.grid'調用中設置'stringsAsFactors = FALSE'。 – Thomas