2016-07-03 2 views
0

Ich benutze R und lese eine CSV-Datei, um eine Gruppe von Spalten in der Datei zusammenzufassen, deren Werte Nullen und Einsen sind, um zu sehen, ob sie allergische Reaktionen haben oder nicht. Diese Datei enthält 538 Variablen, anfangs sind diese Variablen Ganzzahlen, also konvertiere ich alle ganzen Zahlen in Faktorvariablen, die meinen Zweck lösen. Aber ich bin nur fähig, Tabellenfunktion zu verwenden, um die Werte auf allen Faktorspalten zusammenzufassen, aber ich muss die Spalten gruppieren und sie auf Tabellenfunktion für Gruppenzusammenfassung anwenden. Könnte mir bitte jemand in dieser Hinsicht helfen?So fügen Sie einen Bereich von CSV-Spalten zu einer Tabelle hinzu

Mein Code ist wie folgt ....

egg1 <-read.csv("egg.csv",header = TRUE) 

str(egg1) 

egg1[sapply(egg1, is.integer)] <- lapply(egg1[sapply(egg1, is.integer)], as.factor) 

lapply(egg1, function(egg1) { 
    if (is.factor(egg1)) return(table(egg1)) 
    }) 

Hier in Tabelle Suche Bereich der variablen der CSV-Datei Gruppe für Gruppe zu übergeben. Bitte werfen Sie einen Blick auf meine Beispiel-CSV, die 3 Gruppen enthält, die ich zum besseren Verständnis eingefärbt habe. F1: Ich möchte die Verteilung von Ja/Nein (1/0) für Dosis1, Dosis2 und Dosis3 berechnen, wobei jeweils 3 Symptome aufgelistet sind. Q2: Dann vergleichen Sie die Symptome aller 3 Dosen.

Tabelle funktioniert gut, indem eine Zusammenfassung aller Spalten angezeigt wird, aber ich brauche eine Gruppenübersicht.

sample data

+1

Es ist im Allgemeinen nicht ratsam Zahlen in Faktoren zu drehen, da sie das Potenzial zur Einführung Bugs auf der ganzen Linie hat (es sei denn, Sie sind sehr vorsichtig) aufgrund der Tatsache, dass Faktoren als ganze Zahlen gespeichert sind.Wenn Sie nur versuchen, eine Tabelle für jede Spalte zu erstellen, brauchen Sie nur 'lapply (egg1, Tabelle)' – alistaire

+1

Ich muss eine Tabelle von fast jeder Spalte, aber in Gruppen erstellen. Offensichtlich müsste ich einige Spalten überspringen, zum Beispiel Geburtsdatum und Gewicht. Aber die Gruppierung ist für mich am wichtigsten, weil diese bestimmte Gruppe zu einem bestimmten Abschnitt in der CSV-Datei gehören würde. – Usman

+0

Sie reden nicht mehr von einer CSV, sondern von einem data.frame. Wirklich, obwohl alles, was ich zu diesem Zeitpunkt tun kann, spekuliert darüber, was Sie brauchen; Sie müssen [lesen] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610) darüber, wie man eine minimale (offensichtlich nicht mit 538 Spalten, aber eine repräsentative Teilmenge) reproduzierbar (mit Daten!) Beispiel und bearbeiten Sie Ihre Frage. – alistaire

Antwort

0

Wie @alistaire gesagt, sind wir ein reproduzierbares Beispiel fehlen, aber vielleicht wird dies ausreichend an der Struktur und Ihre Absicht erraten.

Ich werde einige Daten fabrizieren, ich hoffe, es erinnert sehr an Ihre echten Daten. Statt factor s, ich denke, sollten Sie in der Lage sein, mit logical zu arbeiten, da sagte man die Spalten von Interesse waren eines von 0 oder 1.

set.seed(4) 
egg1 <- data.frame(
    v1 = sample(0:1, size=20, replace=TRUE), 
    v2 = sample(0:1, size=20, replace=TRUE), 
    v3 = sample(c('a','b','c'), size=20, replace=TRUE), 
    v4 = sample(0:1, size=20, replace=TRUE), 
    stringsAsFactors = FALSE) 
str(egg1) 
# 'data.frame': 20 obs. of 4 variables: 
# $ v1: int 1 0 0 0 1 0 1 1 1 0 ... 
# $ v2: int 1 1 1 0 1 1 0 1 1 1 ... 
# $ v3: chr "c" "a" "b" "a" ... 
# $ v4: int 1 0 1 1 0 1 0 1 1 1 ... 

(I der v3 mit der Annahme, dass nicht alle Spalten sind 0/1 boolean)

Dies ist ein erster Versuch.

sapply(Filter(is.numeric, egg1), 
     function(egg) table(egg == 1)) 
#  v1 v2 v4 
# FALSE 9 7 10 
# TRUE 11 13 10 

Leider hat es einen leichten Fehler: sie alle Ergebnisse übernehmen von der gleichen Länge sind, die nicht immer wahr ist:

set.seed(105966) 
egg1 <- data.frame(
    v1 = sample(0:1, size=20, replace=TRUE), 
    v2 = sample(0:1, size=20, replace=TRUE), 
    v3 = sample(c('a','b','c'), size=20, replace=TRUE), 
    v4 = sample(0:1, size=20, replace=TRUE), 
    stringsAsFactors = FALSE) 
sapply(Filter(is.numeric, egg1), 
     function(egg) table(egg == 1)) 
# $v1 
# FALSE TRUE 
#  9 11 
# $v2 
# FALSE TRUE 
#  8 12 
# $v4 
# TRUE 
# 20 

(Das heißt, es ist eine Liste zurückkehrt, weil nicht alle Elemente sind mit einer Länge von 2 zurück. v4 alle 1s hatte) Die Lösung ist man immer mindestens eine von jeder Ebene zählen, um sicherzustellen, und vergewissern Sie sich, um nicht Zählung, die in den Ergebnissen:

sapply(Filter(is.numeric, egg1), 
     function(egg) table(c(TRUE, FALSE, egg == 1)) - 1) 
#  v1 v2 v4 
# FALSE 9 8 0 
# TRUE 11 12 20 
0

Ihre Screenshot Probe verwenden, sollten Sie Ihren Datenrahmen Umformung. Zuerst, melt() Dosis Symptomsäulen von weit nach lang, dann dcast() zu migrieren nein/ja in separate Spalten. Sie können sogar die dose_symp Spalten aufgeteilt Dosis und symp Felder für zwei Gruppen zu trennen:

library(reshape2) 

df <- read.csv("Input.csv", stringsAsFactors = FALSE) 

# MELT (LEAVING OUT TIME COLS) 
mdf <- melt(df[!grepl("time", names(df))], id.vars = c("id", "DOB", "weight"), 
      variable.name = "symp_type") 
mdf$key <- 1  
# CAST (FOR NO/YES COLUMNS, SUMMED ON KEY) 
mdf <- dcast(mdf, id + DOB + weight + symp_type ~ value, sum, value.var = "key") 

# UPDATE COLUMNS 
names(mdf)[5:6] <- c("no", "yes") 

mdf$symp_type <- as.character(mdf$symp_type) 
mdf$dose <- sapply(strsplit(as.character(mdf$symp_type),"_"), "[", 1) 
mdf$symp <- sapply(strsplit(as.character(mdf$symp_type),"_"), "[", 2) 
mdf$symp_type <- NULL 

# GROUP AGGREGATION (DATA REPEATS DUE TO REPLICATED DATA IN SAMPLE) 
aggdf <- aggregate(.~symp, mdf[c("symp", "no", "yes")], FUN = sum) 
aggdf 
# symp no yes 
# 1 symp1 18 12 
# 2 symp2 18 12 
# 3 symp3 18 12 

aggdf <- aggregate(.~dose, mdf[c("dose", "no", "yes")], FUN = sum) 
aggdf 
# dose no yes 
# 1 dose1 18 12 
# 2 dose2 18 12 
# 3 dose3 18 12 

aggdf <- aggregate(.~symp + dose, mdf[c("symp", "dose", "no", "yes")], FUN = sum) 
aggdf 
# symp dose no yes 
# 1 symp1 dose1 6 4 
# 2 symp2 dose1 6 4 
# 3 symp3 dose1 6 4 
# 4 symp1 dose2 6 4 
# 5 symp2 dose2 6 4 
# 6 symp3 dose2 6 4 
# 7 symp1 dose3 6 4 
# 8 symp2 dose3 6 4 
# 9 symp3 dose3 6 4 
+0

Danke Jungs für Ihre Hilfe, ich werde Ihre Codes ausprobieren. Obwohl ich neu bei R bin, werde ich versuchen, es umzusetzen. – Usman

Verwandte Themen