2016-05-18 11 views
1

Ich habe einen Datenrahmen mit den Zählungen "Ja", "Nein" und "-" (keine Antwort) für Umfragefragen für jeden Staat. Die Zählungen werden in den Zellen des Datenrahmens als eine Tabelle mit benannten Spalten ("-", "N", "Y") gespeichert, und ich habe Probleme zu verstehen, wie ich eine Funktion für alle Spalten programmgesteuert ausführen kann.Wie arbeite ich mit einer Tabelle innerhalb eines Datenrahmens?

Grundsätzlich möchte ich den Prozentsatz von "Y" für jede Zelle erhalten.

usfarmersmarkets <- read_csv("https://apps.ams.usda.gov/FarmersMarketsExport/ExcelExport.aspx") 
usfm <- usfarmersmarkets[c(2, 9:11,21, 22, 24:58)] 
testing <- aggregate(usfm[,7:41], list(usfm$State), table) 

Dies ist ein Beispiel dafür, was Ich mag aber für alle Spalten nicht nur $ Kredit und nach unten alle Zeilen nicht nur „California“ zu tun. Vielleicht könnte ich die Ausgabe als Liste oder Datenframe speichern.

testing[testing$Group.1 == "California",]$Credit$'05'[2]/
sum(testing[testing$Group.1 == "California",]$Credit$'05') *100 

     Y 
50.06536 


The dataframe has this general format 
|Group.1  Credit  WIC   WICCash  ... 
|Alabama c(105, 39) c(134, 10) c(140, 4)  ... 
|Alaska  c(20, 18)  38   c(30, 8)  ... 
|Arizona c(28, 69)  c(62, 35)  c(60, 37)  ... 
|Arkansas c(69, 33)  c(81, 21)  c(92, 10)  ... 
|California 382:383  c(403, 362) c(385, 19, 361) ... 
|... 

Wie Sie vielleicht bemerkt haben, enthalten die Zellen 1 bis 3 verschiedene Werte. Wenn die Zelle einen Wert von 1 hat, sind es wahrscheinlich alle "Nein" s. Wenn es 2 Werte hat, ist es höchstwahrscheinlich die erste Zahl ist die "Nein" s und die zweite ist die "Ja" s. Wenn es 3 Werte hat, ist es sehr wahrscheinlich, dass die erste Zahl die "-" s, die zweite die "Nein" s und die dritte die "Ja" s ist.

Jede Hilfe würde sehr geschätzt werden.

Auch ich bin ziemlich neu zu R so leid, wenn meine Terminologie aus ist, fühle mich frei, mich auf irgendetwas zu korrigieren.

Antwort

1

Ich denke, der einfachste Weg, dies zu tun ist mit dplyr und tidyr. Dies sind großartige Werkzeuge, um zu lernen, wenn Sie R aufnehmen, weil sie wirklich starke Möglichkeiten bieten, über Datenmanipulation nachzudenken. In diesem Fall habe ich die Daten aus einem breiten Format in ein langes Format umwandeln, dann eine gruppierte Betrieb, den Anteil der Ys zu zählen, ist es dann für den Finaltisch wieder in breiten Daten drehen:

library(dplyr) 
library(tidyr) 

usfm %>% 
    gather(var, value, Credit:WildHarvested) %>% 
    group_by(State, var) %>% 
    summarise(prop_Y = sum(value == "Y")/n()) %>% 
    spread(var, prop_Y) 

Es gibt andere Möglichkeiten, um den Job zu tun, wie das Anwenden einer Funktion auf jede Spalte mit lapply, aber ich denke, dplyr ist wahrscheinlich die einfachste Sache zu holen und mächtigsten auf der Straße.

+0

das funktioniert perfekt dank so viel. Ich werde mehr mit dplyr und tidyr spielen müssen. Ich kam bei diesem Problem scheinbar alles falsch an. Danke noch einmal! – xpontimus

+0

Ich denke, es ist mehr, dass Sie gerade den Schmerz erlebt haben, den dplyr und tidyr entwickelt haben, um zu lindern. Der große Vorteil der Pakete besteht darin, dass Sie ein gutes mentales Modell für Ihre nächsten Schritte entwickeln können, um von dort, wo Ihre Daten sind, dorthin zu gelangen, wo Sie es haben wollen. Ich würde Hadleys Buch hier empfehlen: http://r4ds.had.co.nz/transform.html viele andere großartige Sachen über die R-Sprache in diesem Buch. – Shorpy

+0

oh fantastisch. Das wird eine tolle Sommerlesung, sehr geschätzt – xpontimus

Verwandte Themen