简体   繁体   中英

Create all possible combinations of binomic variables in r

I have this dataset

install.packages("combinat")
install.packages("quantmod")
library(quantmod)
library(combinat)
getSymbols("AAPL",from="2013-01-01")
data<-AAPL
p1<-4  
dO<-data[,1]
dC<-data[,4]
emaO<-EMA(dO,n=p1)
emaC<-EMA(dC,n=p1)

and this variables

Pos_emaO_dO_UP<-emaO>dO
Pos_emaO_dO_D<-emaO<dO
Pos_emaC_dC_UP<-emaC>dC
Pos_emaC_dC_D<-emaC<dC
Pos_emaC_dO_D<-emaC<dO
Pos_emaC_dO_UP<-emaC>dO
Pos_emaO_dC_UP<-emaO>dC
Pos_emaO_dC_D<-emaO<dC

or alternatively

Pos_emaO_dO<-ifelse(emaO>dO,"UP",
                    ifelse(emaO<dO,"D","Equal"))
Pos_emaC_dC<-ifelse(emaC>dC,"UP",
                    ifelse(emaC<dC,"D","Equal"))
Pos_emaC_dO<-ifelse(emaC>dO,"UP",
                    ifelse(emaC<dO,"D","Equal"))
Pos_emaO_dC<-ifelse(emaO>dC,"UP",
                    ifelse(emaO<dC,"D","Equal"))



  frame<-data.frame(Pos_emaO_dO_UP,Pos_emaO_dO_D,Pos_emaC_dC_UP,Pos_emaC_dC_D,Pos_emaC_dO_D,Pos_emaC_dO_UP,Pos_emaO_dC_UP,Pos_emaO_dC_D)
    vector<-colnames(frame)<-c("Pos_emaO_dO_UP","Pos_emaO_dO_D","Pos_emaC_dC_UP","Pos_emaC_dC_D","Pos_emaC_dO_D","Pos_emaC_dO_UP","Pos_emaO_dC_UP","Pos_emaO_dC_D")
Three<-as.data.frame(combn(vector,3))
Two<-as.data.frame(combn(vector,2))
Four<-as.data.frame(combn(vector,4))

EDITED: I edited my question to this. I need to delete these combinations (V1:Vn) which, for example, has both possible combinations of variable. ex Pos_emaO_dO_UP & Pos_emaO_dO_D. Generally, if the formula before D or UP is same and both (UP & D) are in it, delete this combination. I tried some unique, but with no success.

Note: I want then to use paste like paste(combination,collapse="&") and use this "pasted" combinations to subset the main table then like subset(main_table,"pasted_combination") and run this trough lapply function which I have. Will it works? Thanks

I'm still not quite sure if I understood you right, but consider this example. We have 3 variables ( x1 , x2 , x3 ) and each of them can be either Up or D or Equal . To compute all possible combinations of the 3 variables, you can use expand.grid :

dd <- expand.grid(x1 = c("UP", "D", "Equal"), 
                  x2 = c("UP", "D", "Equal"), 
                  x3 = c("UP", "D", "Equal"))

dd
#      x1    x2    x3
#1     UP    UP    UP
#2      D    UP    UP
#3  Equal    UP    UP
#4     UP     D    UP
#5      D     D    UP
#6  Equal     D    UP
#7     UP Equal    UP
#8      D Equal    UP
#9  Equal Equal    UP
#10    UP    UP     D
#11     D    UP     D
#12 Equal    UP     D
#13    UP     D     D
#14     D     D     D
#15 Equal     D     D
#16    UP Equal     D
#17     D Equal     D
#18 Equal Equal     D
#19    UP    UP Equal
#20     D    UP Equal
#21 Equal    UP Equal
#22    UP     D Equal
#23     D     D Equal
#24 Equal     D Equal
#25    UP Equal Equal 
#26     D Equal Equal
#27 Equal Equal Equal

Now as far as I understood you, you want only those rows where UP and D are not both present. To do this, you could use apply to check in each row the appearance of UP and D and then select the correct rows.

#create a new column "check" and set 1 if "UP" AND "D" are present in row
dd$check <- apply(dd, 1, function(x) ifelse("UP" %in% x & "D" %in% x, 1 , 0))

The result is then:

> dd
#      x1    x2    x3 check
#1     UP    UP    UP     0
#2      D    UP    UP     1
#3  Equal    UP    UP     0
#4     UP     D    UP     1
#5      D     D    UP     1
#6  Equal     D    UP     1
#7     UP Equal    UP     0
#8      D Equal    UP     1
#9  Equal Equal    UP     0
#10    UP    UP     D     1
#11     D    UP     D     1
#12 Equal    UP     D     1
#13    UP     D     D     1
#14     D     D     D     0
#15 Equal     D     D     0
#16    UP Equal     D     1
#17     D Equal     D     0
#18 Equal Equal     D     0
#19    UP    UP Equal     0
#20     D    UP Equal     1
#21 Equal    UP Equal     0
#22    UP     D Equal     1
#23     D     D Equal     0
#24 Equal     D Equal     0
#25    UP Equal Equal     0
#26     D Equal Equal     0
#27 Equal Equal Equal     0

Now you can select all rows where check is 0.

dd <- dd[dd$check == 0,]
dd
#      x1    x2    x3   check
#1     UP    UP    UP       0
#3  Equal    UP    UP       0
#7     UP Equal    UP       0
#9  Equal Equal    UP       0
#14     D     D     D       0
#15 Equal     D     D       0
#17     D Equal     D       0      
#18 Equal Equal     D       0      
#19    UP    UP Equal       0      
#21 Equal    UP Equal       0      
#23     D     D Equal       0      
#24 Equal     D Equal       0      
#25    UP Equal Equal       0      
#26     D Equal Equal       0      
#27 Equal Equal Equal       0      

Of course you can delete the extra column (already in the previous subsetting) or now:

dd <- dd[, -4]

Is that what you were after?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM