2012-07-24 99 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