我有以下类型的数据,意味着因素组合
P1 <- c("a", "a", "a", "a", "b", "b", "b", "c", "c", "d")
P2 <- c("a", "b", "c", "d", "b", "c", "d", "c", "d", "d")
myfactors <- data.frame(P1, P2)
P1 P2
1 a a
2 a b
3 a c
4 a d
5 b b
6 b c
7 b d
8 c c
9 c d
10 d d
实际上,因素可能是任何数字,我正在尝试编写一个可以适用于任何级别因素的函数。我想设置对比数据集中可用的所有组合。例如,在该数据集a-b,a-c,a-d,b-c,b-d,c-d中。这里的对比规则。
for example for "a-b" is if P1 = P2 = a or b the coefficient = -1,
if P1=a, P2= b or P1= b, P2 = a, the coefficient = 2,
else coefficient = 0
输出系数矩阵如下所示:
P1 P2 a-b a-c a-d b-c b-d c-d
a a -1 -1 -1 0 0 0
a b 2 0 0 0 0 0
a c 0 2 0 0 0 0
a d 0 0 2 0 0 0
b b 1 0 0 -1 -1 0
b c 0 0 0 2 0 0
b d 0 0 0 0 2 0
c c 0 1 0 0 0 -1
c d 0 0 0 -1 0 2
d d 0 0 -1 0 -1 -1
由于我正在思考的功能是灵活的,如果我将应用于以下数据集,
P1 <- c("CI", "CI", "CI", "CD", "CD", "CK", "CK")
P2 <- c("CI", "CD", "CK", "CD", "CK", "CK", "CI")
mydf2 <- data.frame(P1, P2)
mydf2
P1 P2
1 CI CI
2 CI CD
3 CI CK
4 CD CD
5 CD CK
6 CK CK
7 CK CI
此数据框的预期系数矩阵为:
P1 P2 CI-CD CI-CK CD-CK CK-CI
CI CI -1 -1 0 -1
CI CD 2 0 0 0
CI CK 0 2 0 0
CD CD -1 0 -1 0
CD CK 0 0 2 0
CK CK 0 -1 -1 -1
CK CI 0 0 0 2
我尝试了几种方法,但无法成功完成计划。
编辑:
(1)我没有测试所有可能的组合,只测试出现在P1和P2中的组合
(2)我打算不仅为这个实例开发解决方案,而且为一般应用开发解决方案。例如上面的myfactors数据帧。
答案 0 :(得分:5)
您没有提供您选择6个有序P1和P2值组合的原因,所以我只是完成了所有这些:
combos <- cbind( combn(unique(c(P2, P1)), 2), combn(unique(c(P2, P1)), 2)[2:1, ])
combos
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "CI" "CI" "CD" "CD" "CK" "CK"
[2,] "CD" "CK" "CK" "CI" "CI" "CD"
当我完成逻辑时,测试条件1)和2)似乎更紧凑,只需使用布尔数学来返回结果。如果两个条件都是不真实的,你就会得到0.我检查了与你的条目不匹配的条目,我认为你的构造错误。你在“CI-CK”第7行中有0,我认为你的规则的答案应该是2。:
sapply(1:ncol(combos), function(x) with( mydf2,
2*( (P1==combos[1,x] & P2 == combos[2,x]) | (P2==combos[1,x] & P1 == combos[2,x])) -
(P1 == P2 & P1 %in% combos[,x]) ) )
#---------------
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] -1 -1 0 -1 -1 0
[2,] 2 0 0 2 0 0
[3,] 0 2 0 0 2 0
[4,] -1 0 -1 -1 0 -1
[5,] 0 0 2 0 0 2
[6,] 0 -1 -1 0 -1 -1
[7,] 0 2 0 0 2 0
#------------------
mydf2[ , 3:8] <- sapply(1:ncol(combos), function(x) with( mydf2,
2*( (P1==combos[1,x] & P2 == combos[2,x]) | (P2==combos[1,x] & P1 == combos[2,x])) -
(P1 == P2 & P1 %in% combos[,x]) ) )
mydf2
#-----------------
P1 P2 CI-CD CI-CK CD-CK CD-CI CK-CI CK-CD
1 CI CI -1 -1 0 -1 -1 0
2 CI CD 2 0 0 2 0 0
3 CI CK 0 2 0 0 2 0
4 CD CD -1 0 -1 -1 0 -1
5 CD CK 0 0 2 0 0 2
6 CK CK 0 -1 -1 0 -1 -1
7 CK CI 0 2 0 0 2 0