2017-08-22 1 views
2

Die angegebenen Daten sindWie konvertiert man die Werte in einem Datenrahmen durch die levels() -Funktion in Dummy-Werte?

SNP1 <- c("AA","GG","AG") 
SNP2 <- c("AA","CC","AC") 
SNP3 <- c("GG","AA","AG") 
df<- data.frame(SNP1, SNP2, SNP3) 
colnames(df)<- c('rs10000438', 'rs10000500','rs1000055') 

I eine Datenfunktion definieren, die dominant_dummy ist. Wenn ich die Codes durchführe, habe ich festgestellt, dass es falsch läuft.

Error in if (!check) { : argument is of length zero 

Wenn ich debuggen fand ich, dass das Argument x in dieser ist ein dataframe, und ich brauche levels(x) die Funktion zu verwenden, um das Niveau von x zu überprüfen und auch levels(x)<- c(0,1,1), die levels Funktion Rückkehr null zuweisen. Mein Zweck ist es, die Werte im Datenrahmen df basierend auf den Bedingungen zu Dummy-Werten zu konvertieren.

SNP_lib<- NCBI_snp_query(names(x)) 
    NCBI_snp_query(names(x)) 
    SNP_min<- SNP_lib$Minor 
    SNP_name<- SNP_lib$Query 
    SNP_min ="A" 
    SNPs <- x 

    check<-substr(levels(SNPs)[2],1,1)==SNP_min 

Ich brauche die Dummy-Werte auf diese dataframe wie levels(x)<- c(0,1,1) zuweisen. Wie kann ich das machen?

library(rsnps) 
dominant_dummy<- function(x){ 

    SNP_lib<- NCBI_snp_query(names(x)) 
    NCBI_snp_query(names(x)) 

    SNP_min<- SNP_lib$Minor 
    SNP_name<- SNP_lib$Query 
    SNP_min ="A" 
    SNPs <- x 

    check<-substr(levels(SNPs)[2],1,1)==SNP_min 
    if(!check){ 
    levels(SNPs)<-c(0,1,1) 
    SNPs<-as.numeric(as.character(SNP)) 
    }else {levels(SNPs)<-c(1,1,0) 
    SNPs<-as.numeric(as.character(SNP))} 
} 

df_3levels<-sapply(1:ncol(df), function(i) dominant_dummy(df[,i, drop=FALSE])) 

Antwort

0

Sie können die Ebenen eines Datenrahmens nicht überprüfen. Verwenden Sie stattdessen levels(SNPs[[1]]), um die Ebenen in der ersten Spalte zu überprüfen. Aber da auch andere Fehler.

+0

Ja, ich fand auch, dass, obwohl ich die Ebenen von 'x' auf diese Weise bekommen kann, ich noch' c (0,1,1) 'auf' Ebenen (SNPs) 'zuweisen muss, so dass es ist immer noch problematisch. Hast du eine Idee, das zu lösen? – user5802211

+0

Ich weiß nicht, was du machen willst ... Die Level werden in diesem Moment anders benannt. Wenn Sie sie mit 'c (0,1,1) überschreiben, macht das keinen Sinn. Also sei bitte genauer mit deiner Frage. – drmariod

+0

Also habe ich meine Frage neu geschrieben und meinen ursprünglichen Zweck angegeben. Könntest du es dir ansehen? Danke vielmals. – user5802211

0

Mit drei Änderungen an Ihrem Code konnte ich es ohne Fehlermeldung ausführen. Die wichtigste Änderung war in der letzten Zeile.

SNP1 <- c("AA", "GG", "AG") 
SNP2 <- c("AA", "CC", "AC") 
SNP3 <- c("GG", "AA", "AG") 
df <- data.frame(SNP1, SNP2, SNP3) 
colnames(df) <- c('rs10000438', 'rs10000500', 'rs1000055') 

library(rsnps) 
dominant_dummy <- function(x) { 
    SNP_lib <- NCBI_snp_query(names(x)) 
    NCBI_snp_query(names(x)) 

    SNP_min <- SNP_lib$Minor 
    SNP_name <- SNP_lib$Query 
    SNP_min = "A" 
    SNPs <- x 

    check <- substr(levels(SNPs)[2], 1, 1) == SNP_min 
    if (!check) { 
    levels(SNPs) <- c(0, 1, 1) 
    SNPs <- as.numeric(as.character(SNPs)) # fixed 
    } else { 
    levels(SNPs) <- c(1, 1, 0) 
    SNPs <- as.numeric(as.character(SNPs)) # fixed 
    } 
} 

df_3levels <- sapply(df, dominant_dummy) # fixed 

df_3levels 
 rs10000438 rs10000500 rs1000055 
[1,]   1   1   0 
[2,]   0   0   1 
[3,]   1   1   1 

Bitte, lassen Sie mich wissen, ob dies das erwartete Ergebnis ist.

Verwandte Themen