我在数据框中总结了3个不同的组。数据框如下所示:
d <- data.frame(v1 = c("A","A","A","B","B","B","C","C","C"),
v2 = c(1:9), stringsAsFactors = FALSE)
我想要的是将A的值与B的值进行比较.A的值与B的值以及最后的比较B的值与C的值
我构造了2个for循环来迭代v1来提取要比较的组。但是,for循环为我提供了所有可能的组合,如:
A vs. A
A vs. B
A vs. C
B vs. A
B vs. B
B vs. C
C vs. 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
,以便在第一次迭代中group1包含A的值,group2包含B的值。在第二次迭代中,group1包含A和group2的值C的值。作为最后的比较,group1包含B的值,group2包含C的值。
我完全坚持这个问题并希望在这里找到答案。
干杯!
答案 0 :(得分: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
答案 1 :(得分: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
---------------------