2016-05-27 16 views
0

Meine Daten wie folgt aussehen:R: Zählung der Anzahl der Einträge in einer Spalte mit Ausnahme der Blanks

CHROM   Mutant_SNP_2 
3RD     T 
4RD     C 
5RD     
6RD     G 
7RD     A 
8RD     

Ich habe einen CSV-Datenrahmen. Ich möchte eine Zählung von Spalte "Mutant_SNP_2", wie viele Zeilen einen Eintrag haben und daher keine Anzahl von Leerzeichen "" wollen. Ich spalte es nach Spalte "CHROM". Ich bekomme die richtige Ausgabe in Bezug auf Layout mit diesem Code in dplyr: count(combined, Mutant_SNP_2, wt = CHROM, sort = FALSE) aber es zählt nur die leeren Zeilen und nicht diejenigen mit einem Wert. Irgendeine Idee sehr geschätzt. Die Ausgabe erhalte ich:

Mutant_SNP_2       CHROM.x  n 
     (fctr)       (fctr) (int) 
1    gi|339957448|gb|AENI01001139.1| 23 
2    gi|339957449|gb|AENI01001138.1|  9 
3    gi|339957451|gb|AENI01001136.1| 97 
4    gi|339957452|gb|AENI01001135.1| 116 
5    gi|339957453|gb|AENI01001134.1| 175 
6    gi|339957454|gb|AENI01001133.1|  2 
7    gi|339957455|gb|AENI01001132.1| 78 
8    gi|339957456|gb|AENI01001131.1| 51 
9    gi|339957457|gb|AENI01001130.1|  2 
10    gi|339957458|gb|AENI01001129.1| 52 
..   ...        ... ... 
+0

Können Sie vollständigen Code und einen reproduzierbaren Ausgang teilen? Für dein Beispiel würde 'nrow (df [df $ Mutant_SNP_2! =" ",]]' Funktionieren. – mtoto

+0

Danke, das gibt mir die Anzahl der Zeilen ohne Leerzeichen - danke! Aber ich brauche es bei jeder neuen Kategorie der CHROM-Spalte zB nach = "CHROM" oder so? – Cathyt10

+0

@mtoto .... oben Kommentar – Cathyt10

Antwort

3

Sie mit Funktion versuchen können table, die Linie mit TRUE geben Sie die Anzahl der nicht leeren Wert, von CHROM Wert):

Sie können das Ergebnis direkt mit table(df$Mutant_SNP_2!="", df$CHROM)[2, ]

erhalten

Beispiel:

set.seed(123) 
df <- data.frame(CHROM=sample(letters[1:3], 10, replace=TRUE), Mutant_SNP_2=sample(c("", "not blank"), 10, replace=TRUE), stringsAsFactors=FALSE) 

table(df$Mutant_SNP_2!="", df$CHROM) 
#  a b c 
# FALSE 0 2 3 
# TRUE 2 2 1 

table(df$Mutant_SNP_2!="", df$CHROM)[2, ] 
# a b c 
# 2 2 1 
+0

Vielen Dank, das hat funktioniert.Ich bin nicht sicher, warum die anderen Vorschläge nicht funktionierten, sie alle schienen zu sagen, zählen Sie nicht die Lücken, aber sie taten es immer noch, keine Ahnung warum! Stört es dich bitte, mir zu sagen, was das Finale [2,] tut? Du bist ein Star! – Cathyt10

+0

@ Cathyt10 Gern geschehen, froh, dass ich dir helfen konnte. '[2,]' wähle die zweite Zeile des Objekts aus, das durch den Aufruf von 'table' zurückgegeben wurde – Cath

+0

@ Cathyt10 oh und ich bin in keiner Weise ein Star, nur eine winzige kleine Fee ;-) – Cath

1

Wir könnten versuchen, den Booleschen Vektor df$Mutant_SNP_2 != "" gruppiert nach CHROM Summieren. Dies funktioniert, weil TRUE 's zu 1 gezwungen wird, während FALSE' s zu 0.

library(dplyr) 
df %>% group_by(CHROM) %>% 
    summarise(n = sum(Mutant_SNP_2 != "")) 

    CHROM  n 
    (fctr) (int) 
1 3RD  1 
2 4RD  1 
3 5RD  0 
4 6RD  1 
5 7RD  1 
6 8RD  0 
+0

Danke nochmal. Seltsamerweise zählen jetzt alle Einträge mit Ausnahme derjenigen, die einen Eintrag haben, z. B. die Leerzeichen: CHROM.x n (fctr) (int) 1 gi | 339957448 | gb | AENI01001139.1 | 593 2 gi | 339957449 | de | AENI01001138.1 | 31 3 gi | 339957450 | de | AENI01001137.1 | 25 4 gi ​​| 339957451 | de | AENI01001136.1 | 1293 5 gi | 339957452 | de | AENI01001135.1 | 1056 6 gi | 339957453 | de | AENI01001134.1 | 1356 7 gi | 339957454 | de | AENI01001133.1 | 22 8 gi | 339957455 | de | AENI01001132.1 | 750 – Cathyt10

+1

Bitte bearbeiten Sie Ihre Frage mit der erwarteten Ausgabe ** basierend auf Ihren Beispieldaten ** – mtoto

+0

Ich erwarte, dass es genau so aussieht, wie es herauskommt, wie oben gezeigt, aber es zählt die Leerzeichen und nicht die Einträge. Offensichtlich ein Problem mit dem Format meiner Daten. Ich werde versuchen, als txt oder so etwas einzugeben. Vielen Dank. – Cathyt10

1

Versuchen Sie folgendes:

library(data.table) 

setDT(df)[ Mutant_SNP_2 != "", .(count = .N), by=CHROM] 

Vielleicht ist dies?

setDT(df)[ ,.(count= length(unique(Mutant_SNP_2))), by=CHROM] 
+0

Dank dieser Art von Arbeiten, aber wie bei dem Code von mtoto, zählt es tatsächlich die Leerzeichen statt die Einträge. Seltsam, offensichtlich ein Problem mit meinem Datenformat. – Cathyt10

0

Wir können ave von base R zu tun, um diese

with(df1, as.numeric(ave(Mutant_SNP_2, CHROM, 
       FUN= function(x) sum(nzchar(x))))) 
#[1] 1 1 0 1 1 0