2012-07-24 58 views
1

我有3個不同的組彙總在數據框中。數據幀的樣子:迭代數據框中的組的唯一組合

d <- data.frame(v1 = c("A","A","A","B","B","B","C","C","C"), 

       v2 = c(1:9), stringsAsFactors = FALSE) 

我要的是A的值對B的值也值對B的值,並作爲最後的比較,B的值對C的值進行比較

我構建了2循環以迭代v1來提取要比較的組。然而,在for循環給我的所有可能的組合,如:

A對一個

A對乙

一對丙

乙對一個

乙與乙

。B對C^

C對A等...

這裏是我的for循環:

for(i in unique(d$v1)) { 

    for(j in unique(d$v1)) { 

     cat("i = ", i, "j = ", j, "\n") 

     group1 <- d[which(d$v1 == i), ] 

      group2 <- d[which(d$v1 == j), ] 

     print(group1) 
     print(group2) 

     cat("---------------------\n\n") 

    } 
} 

如何管理,只對數據幀d所以,在第一次迭代循環組別包含的價值和第2組中包含的B的值第二次迭代group1包含A和group2的值C的值。作爲最後一次比較,group1包含B的值,group2包含C的值。

我在某種程度上完全停留在那個問題上,希望找到在這裏回答。

乾杯!

+0

你想要進行什麼樣的比較? – Alan 2012-07-24 10:10:48

+0

好吧,而不是隻有v2我的原始數據框有多達10列。所以基本上,group1是d的子數據幀,對於v1 == A,有11列(c1 = v1和c2:11 =附加信息)。因此,group2是相同的子集,但具有v1 == B的值。我希望這是有道理的...... – user969113 2012-07-24 10:17:47

回答

4

也許像這樣的東西會爲你工作。通過一些更多的工作,產出也可以「整理」一點。

我們將使用combn找出組合,並lapply基礎上,組合,子集我們的數據:

temp = combn(unique(d$v1), 2) 
temp 
#  [,1] [,2] [,3] 
# [1,] "A" "A" "B" 
# [2,] "B" "C" "C" 
lapply(1:ncol(temp), function(x) cbind(d[d$v1 == temp[1, x], ], 
             d[d$v1 == temp[2, x], ])) 
# [[1]] 
# v1 v2 v1 v2 
# 1 A 1 B 4 
# 2 A 2 B 5 
# 3 A 3 B 6 
# 
# [[2]] 
# v1 v2 v1 v2 
# 1 A 1 C 7 
# 2 A 2 C 8 
# 3 A 3 C 9 
# 
# [[3]] 
# v1 v2 v1 v2 
# 4 B 4 C 7 
# 5 B 5 C 8 
# 6 B 6 C 9 
+0

當然,你可能更喜歡在'function(x)...'之後使用'rbind'或'list'而不是'cbind'。 – A5C1D2H2I1M1N2O1R2T1 2012-07-24 10:48:17

+0

偉大的做法。非常感謝。這是我一直在尋找的方式! – user969113 2012-07-24 10:54:17

2

我個人很喜歡它的優雅mrdwab的答案,但如果你仍然想這樣做與循環用自己的方式我想這個修復它(考慮到這會搞亂你的代碼,這是更好地保持它的整潔:)

u <- unique(d$v1) 
for (i in 1:length(u)) { 
    if (i < length(u)) { 
     for (j in u[(i+1):length(u)]) { 
      group1 <- d[which(d$v1 == u[i]), ] 
      group2 <- d[which(d$v1 == j), ] 
      cat("i = ", u[i], "j = ", j, "\n") 
      print(group1) 
      print(group2) 
      cat("---------------------\n\n") 
     } 
    } 
} 

,並導致此:

i = A j = B 
    v1 v2 
1 A 1 
2 A 2 
3 A 3 
    v1 v2 
4 B 4 
5 B 5 
6 B 6 
--------------------- 

i = A j = C 
    v1 v2 
1 A 1 
2 A 2 
3 A 3 
    v1 v2 
7 C 7 
8 C 8 
9 C 9 
--------------------- 

i = B j = C 
    v1 v2 
4 B 4 
5 B 5 
6 B 6 
    v1 v2 
7 C 7 
8 C 8 
9 C 9 
--------------------- 
+0

很好的排序:)然而,正如你所說,我認爲mrdwab的解決方案是一個更好的方式:) – user969113 2012-07-24 10:55:05