Temat: Jak napisac funkcje dla zmieniajacej sie ilosci zmiennych
Dzieki wielkie Maciej i Adrian za zainteresowanie sie tematem i rozwiazania.
Adrian nie moglam zastosowac tego co piszesz bo u mnie zmienna GroupN jest class factor
Levels: c-p-s lis
i otrzymuje error " not meaningful for factors". Prosze spojrz na ponizsze rozwiazanie moze da sie cos przerobic albo dalej da sie zrobic z ponizszym.
Sprobowalam zastosowanic to co pisze Maciej i to wydaje sie ze dziala.
Podam konkretnie moj przyklad zeby bylo wiadmo co wlasciwie ta funkcja ma robic. length(vardf$Patient) jest 23
Patient moze byc w Groupie c-p-s lub lis (9 pacjentow jest w obu, jak ponizej widac np patient 10 a 4 pacjentow jest tylko w lis)
Oto 4 pierwsze wiersze z mojego datasetu, ktory u mnie nazywa sie vardf,
head(vardf):
Patient GroupN pS1 pS2 pS3 pS4 pS5 pS6 pS7 pS8 pCO2
10 c-p-s 1274.0 1365.5 950.5 1111.0 1279.5 353.0 138.0 1147.0 61.5
10 lis 623.5 879.5 633.0 676.5 637.0 130.0 14.5 595.5 38.5
11 c-p-s 856.0 624.5 430.5 473.0 796.5 212.0 42.5 812.5 59.0
11 lis 236.0 466.0 321.0 367.0 351.0 81.0 5.0 332.0 40.0
nkol<-ncol(vardf)
stale_zmienne<-c(1,2,nkol)
for (i in 3:(nkol-1)){
K1 = vardf[,c(stale_zmienne,i)]$GroupN == "c-p-s" #dla rozroznienia grup
K3 = vardf[,c(stale_zmienne,i)]$GroupN == "lis"
pdf(paste("plot_for",names(vardf)[i],'.pdf'))
#analiza PCA
pca_p = prcomp((vardf[,c(stale_zmienne,i)])[,-c(1,2)],scale.=T)
#wyciagniecie 1go i 2giego komponentu, w tym przypadku sa tylko dwa
p12<-pca_p$x[,c(1,2)]
plot(p12, pch=16, col="white")
points(p12[K1,],pch=15,col="green")
points(p12[K3,],pch=19,col="red")
abline(h = 0, v = 0, lty=2)
legend("bottomright", legend = c("c-p-s","lis"), col = c("green","red"), pch = c(15,19), cex = 1.2)
title("1st and 2nd PC")
dev.off()
}
Bede wdzieczna jak bedziecie mogli mi dalej pomoc, dalej moj problem jest baardzo skomplikowany.
Teraz chodzi o to by funkcja, liczyla dokladnie to samo co powyzej tylko ze teraz zamiast dodania jednej zmiennej do stalych zmiennych musza byc dodane 2 zmienne.
No wiec kolejne iteracje beda wygladaly tak:
"Patient" "GroupN" "pS1" "pS2"
"Patient" "GroupN" "pS1" "pS3"
...
"Patient" "GroupN" "pS2" "pS3"
"Patient" "GroupN" "pS2" "pS4"
itd...
w kolejnych iteracjach musi byc kombinacja dwoch zmiennych, oczywiscie kazdy z kazdym, z tym ze kolejnosc nie ma znaczenia czyli "pS1" "pS2" i "pS2" "pS1" to to samo.
Nie wiem czy jest mozliwe zrobienie czegos takiego:
zeby w nastepnym kroku zamiast 2 zmiennych dodac 3 zmienne (wszystkie mozliwe kombinacje), oczywiscie w wyniku ma za kazdym razem dawac pdf z plotem (jak w pierwszym przypadku). Moga tez te ploty byc w jednym pdf aby tylko gdzies kolo plotu musi wypisywac dla jakich zmiennych on jest.
Potem nastepny krok to zamiast dodawania 3 zmiennych ma byc dodawane 4 (wszystkie mozliwe kombinacje, oczywiscie kolejnosc nie ma znaczenia) i dalej analogicznie jak powyzej opisane.
Nastepnie w kolejnym kroku zamiast dodania 4 zmiennych, dodac 5 (wszystkie mozliwe kombinacje i kolejnosc nie ma znaczenia) i dalej analogicznie.
W kolejnym kroku zamiast dodania 5 zmiennych, dodac 6 (wszystkie mozliwe kombinacje i kolejnosc bez znaczenia) i dalej analogicznie.
I w ostatnim kroku zamiast 6 zmiennych dodac 7 zmiennych. Tu nastepujace kombinacje sa mozliwe:
1) pS1 pS2 pS3 pS4 pS5 pS6 pS7 (bez pS8)
2) pS1 pS2 pS3 pS4 pS5 pS6 pS8 (bez pS7)
3) pS1 pS2 pS3 pS4 pS5 pS7 pS8 (bez pS6)
4) pS1 pS2 pS3 pS4 pS6 pS7 pS8 (bez pS5)
5) pS1 pS2 pS3 pS5 pS6 pS7 pS8 (bez pS4)
6) pS1 pS2 pS4 pS5 pS6 pS7 pS8 (bez pS3)
7) pS1 pS3 pS4 pS5 pS6 pS7 pS8 (bez pS3)
8) pS2 pS3 pS4 pS5 pS6 pS7 pS8 (bez pS2)
Zdaje sobie sprawe ze moj problem jest baaardzo trudny do rozwiazania i nie wiem czy ktos bedzie umial to zrobic. Moze choc dla dwoch zmiennych ktos bedzie umial zrobic. Moze tez byc ze to beda osobne funkcje dla 2 zmiennych, potem inna funkcja dla 3 zmiennych, potem inna dla 4 zmiennych itd.
Ilosc funkcji nie ma znaczenia aby tylko liczylo tak jak w pierwszym przypadku dla 1 zmiennej.
Z gory wielkie dzieki.
Kama Jansen edytował(a) ten post dnia 05.02.13 o godzinie 10:41