Variablen mit gleicher Endung zusammen führen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Variablen mit gleicher Endung zusammen führen

Beitrag von jessi »

Hallo miteinander,

ich habe mehrere Variablen erstelle die so benannt sind:

Code: Alles auswählen

 "tab_wg_1_k_150"    "tab_wg_1_k_180"    "tab_wg_1_k_190"    "tab_wg_1_k_20"     "tab_wg_1_k_200"    "tab_wg_1_k_210"    "tab_wg_1_k_220"    "tab_wg_1_k_50"    "tab_wg_1_k_70"     "tab_wg_1_k_90"     "tab_wg_2_k_100"    "tab_wg_2_k_110"    "tab_wg_2_k_120"    "tab_wg_2_k_14"     "tab_wg_2_k_140"    "tab_wg_2_k_150"   "tab_wg_2_k_180"    "tab_wg_2_k_190"    "tab_wg_2_k_20"     "tab_wg_2_k_200"    "tab_wg_2_k_210"    "tab_wg_2_k_220"    "tab_wg_2_k_50"     "tab_wg_2_k_70"    "tab_wg_2_k_90"     "tab_wg_3_k_100"    "tab_wg_3_k_110"    "tab_wg_3_k_120"    "tab_wg_3_k_14"     "tab_wg_3_k_140"    "tab_wg_3_k_150"    "tab_wg_3_k_190"   "tab_wg_3_k_20"     "tab_wg_3_k_200"    "tab_wg_3_k_210"    "tab_wg_3_k_50"     "tab_wg_3_k_70"     "tab_wg_3_k_90"     "wg_1_k_100"        "wg_1_k_110"       
Die Variablen enthalten den Output von table und sind nicht immer gleicher Dimension:

Code: Alles auswählen

        1      3
  3 0.0000 0.0000
  4 0.0000 0.0000
  5 0.0697 0.0000

         1      2      3
  2 0.0000 0.0000 0.0049
  3 0.0000 0.0000 0.0055
  4 0.0000 0.0020 0.0000
  5 0.0703 0.0000 0.0000

       1      3
  2 0.0000 0.0036
  3 0.0000 0.0572
  4 0.0000 0.0745
  5 0.0610 0.0000
Nun möchte ich Variablen mit den gleichen Endzahlen zusammenfassen (tab_wg_1_k_150, tab_wg_2_k_150,..., tab_wg_12_k_150). Mit data.frame funktioniert das nicht, da die einzelnen Variablen nicht die gleiche Dimension haben. Kann ich hier die entsprechenden Variablen auf anderen Wege zusammenführen, sodass ich am Ende eine neue Variabel mit der entsprechenden Endnummer (zB. 150) erhalte? Die Matrizen sind maximal 3x5 groß und ich habe auch versucht, die jeweiligen Matrizen mit Null auf eine 3x5 Matrix zu ergänzen, das ist mir aber leider auch nicht gelungen.

Danke schon mal.
Grüße
Jessi
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Variablen mit gleicher Endung zusammen führen

Beitrag von jogo »

Hallo Jessi,

mit Listen kann man so ziemlich alles wie auch immer strukturieren.
Wie sind denn Deine Objekte entstanden?
Idealerweise sollte man nicht so viele Objekte rudelweise im Workspace erzeugen.

Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: Variablen mit gleicher Endung zusammen führen

Beitrag von jessi »

Hallo Jörg,

danke für deine Antwort.
Meine Daten habe ich so erstellt

Code: Alles auswählen

h_2 <- read.csv("df_2.csv", header = T, sep = ";")
 str(h_2)
'data.frame':   64 obs. of  5 variables:
 $ Class        : int  150 150 20 20 50 20 14 14 20 20 ...
 $ Group        : num  2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.2 ...
 $ Hoehen       : num  2127 2071 2002 1991 2069 ...
 $ Hoehenklassen: int  5 5 5 5 5 5 5 5 5 5 ...
 $ Dichte       : int  1 1 1 1 1 1 1 1 1 1 ...

for (i in 1:length(unique(h_2$Class))) {
       namx <- paste("wg_2_k",unique(h_2$Class)[i],sep = "_") 
       assign(namx, subset(h_2, h_2$Class == unique(h_2$Class[i]))) 

       namy <- paste("tab_wg_2_k",unique(h_2$Class)[i], sep = "_")
       assign(namy, round((table(get(sprintf("wg_2_k_%s",unique(h_2$Class)[i]))$Hoehenklassen, 
				get(sprintf("wg_2_k_%s",unique(h_2$Class)[i]))$Dichte)/length(h_2$Class)),4) )}

 ls()
 [1] "h_2"            "h2"             "i"              "namx"           "namy"           "tab_wg_2_k_14"  "tab_wg_2_k_150" "tab_wg_2_k_20" 
 [9] "tab_wg_2_k_200" "tab_wg_2_k_50"  "tab_wg_2_k_70"  "wg_2_k_14"      "wg_2_k_150"     "wg_2_k_20"      "wg_2_k_200"     "wg_2_k_50"     
[17] "wg_2_k_70"   
Insgesamt habe ich dann ca. 50 Files, die alle wie h_2 aufgebaut sind, es gibt also den obigen Code etwa 50 mal. Einen Teil der Daten habe ich als csv. angehängt. Die Höhenklassen laufen von 1 bis 5, die Dichte von 0 bis 3, es kommen aber nicht alle Werte vor, darum ergeben sich unterschiedliche Dimensionen.

Um jetzt die einzelnen Klassen besser vergleichen zu können, möchte ich alle - z.B. _14 - Variablen in ein csv. speichern (zB. "Auswertung_Class14.csv").

Kannst du mir da weiterhelfen und mir weitere Tipps für die Umsetzung geben (ich weiß, mein Code ist nicht gerade elegant, aber er läuft so weit mal :) )

Danke
glg. Jessi
Zuletzt geändert von jessi am So Okt 14, 2018 6:28 pm, insgesamt 1-mal geändert.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Variablen mit gleicher Endung zusammen führen

Beitrag von jogo »

Hallo Jessi,

ich hatte es schon befürchtet, dass Du eine der bösen Funktionen eingesetzt hast, um dieses Rudel an Objekten zu erzeugen (es geht ja auch kaum anders :? ).
Ich werde mir den Code morgen mal anschauen.
Bis dahin erstmal der passende Spruch als Anregung zum Sinnieren:

Code: Alles auswählen

library("fortunes")
fortune(236)
Gruß, Jörg
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Variablen mit gleicher Endung zusammen führen

Beitrag von jogo »

Hallo Jessi,

wahrscheinlich machst Du es Dir viel zu kompliziert. Wie wäre es mit:

Code: Alles auswählen

h_2 <- read.csv("http://forum.r-statistik.de/download/file.php?id=329", header = TRUE, sep = ";")

wg2k     <- split(h_2, h_2$Class)
tab_wg2k <- lapply(wg2k, function(wg) table(wg$Hoehenklassen, wg$Dichte)/nrow(h_2))
# oder sogar:
sapply(wg2k, function(wg) table(wg$Hoehenklassen, wg$Dichte)/nrow(h_2))
# oder so
tapply(h_2$Class, h_2$Class, length)/nrow(h_2)
# oder so
table(h_2$Class)/nrow(h_2)
Bitte schreib nochmal, was Du erreichen möchtest bei der Auswertung.
Zur Zeit sind in Deinem Datensatz nur Daten mit Höhenklasse 5 und Dichte 1

Code: Alles auswählen

summary(h_2)
Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: Variablen mit gleicher Endung zusammen führen

Beitrag von jessi »

Hallo Jörg,

vielen Dank für deine Rückmeldung. Ich habe es mir wirklich viel zu kompliziert gemacht. Für das was du in einer Zeile schaffst, benötige ich 15 :shock: und wahrscheinlich auch noch vier Stunden länger!

Ich hab jetzt zwei weitere Files angehängt. Insgesamt gibt es ca. 50 solcher csv.Files (Dichteverteilung in unterschiedlichen Ländern), die mit "group" gekennzeichnet sind. Jedes Land (group) ist noch zusätzlich in verschiedene Bereiche (class) eingeteilt, diese sind 14, 20, 40, 50, ... , 150, und in diesen Bereichen gibt es unterschiedliche Höhen (Hoehenklassen) und unterschiedliche Dichten (Dichte). Die Höhenklasse hat Werte von 1 bis 5, die Dichte von 0 bis 4. Nun möchte ich die Häufigkeiten (nach Hoehenklasse und Dichte) je Bereich bestimmen, z.B. im Land 1.1 hat der Bereich 14 je Höhenklasse und Dichte eine Häufigkeit von

Code: Alles auswählen

       1    2    3
  2    0    0   40
  3    0    0 1756
  4    0 2555    0
  5 4626    0    0
der Bereich 14 im Land 44.1

Code: Alles auswählen

 
        1         2   
  3     0        0
  4    13     475
  5 5189 0     0
Um jetzt die jeweiligen Bereiche besser miteinander vergleichen zu können, wäre es toll, wenn ich die jeweiligen Bereich der unterschiedlichen Länder in ein csv.File ausgeben lassen könnte, so dass ich am Ende 15 csv-Files habe (zB. "Auswertung_Class14.csv", ...), in denen nur Infos von Class 14 oder Class 20 usw. gespeichert sind.
Bis dahin erstmal der passende Spruch als Anregung zum Sinnieren:
library("fortunes")
fortune(236)
Die Funktion kannte ich gar, aber wirklich sehr passend!

Danke für deine Mühe,
Jessi
Dateianhänge
df_4.csv
(21.17 KiB) 44-mal heruntergeladen
df_2.csv
(39.79 KiB) 43-mal heruntergeladen
Zuletzt geändert von jessi am So Okt 14, 2018 6:28 pm, insgesamt 1-mal geändert.
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Variablen mit gleicher Endung zusammen führen

Beitrag von Athomas »

In df_2.csv sehe ich "02.Feb" als Group - wahrscheinlich wieder ein Excel-Unfall!?

Und hintendran hängen jeweils tausende Leerzeilen :( !
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Variablen mit gleicher Endung zusammen führen

Beitrag von jogo »

Hallo Jessi,

wie wäre es mit

Code: Alles auswählen

setwd(...)
Dateien <- dir(pattern="*.csv")

myfunc <- function(Datei) { 
  h_2 <- read.csv(Datei, header = TRUE, sep = ";")
  table(h_2$Class)/nrow(h_2)
}

lapply(Dateien, myfunc)
:?:
Und wie soll es dann weitergehen?

Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: Variablen mit gleicher Endung zusammen führen

Beitrag von jessi »

Lieber Jörg,

vielen Dank für deine Unterstützung. Mit deinem Input konnte ich den Code etwas umformulieren und "verschönern".

Code: Alles auswählen

files <- dir("...", pattern = "*.csv", full.names = TRUE)

myf2 <- function(dat) {
	h1 <- read.csv(dat, header = T, sep = "") 
	wg1k <- split(h1, h1$Class)
	lapply(wg1k, function(wg) round(table(wg$Hoehenklassen, wg$Dichte)/nrow(h1),4)*100) }

tab_klasse <- lapply(files, myf2)

### str(tab_klasse)
####### List of 52
####### $ :List of 15
#######  ..$ 14 : table [1:3, 1:2] 0 0 7.62 0.25 0.23 0
#######  .. ..- attr(*, "dimnames")=List of 2
####### .. .. ..$ : chr [1:3] "3" "4" "5"
#######  .. .. ..$ : chr [1:2] "1" "3"
####### ..$ 20 : table [1:4, 1:3] 0 0 0 0 0 ...
#######  .. ..- attr(*, "dimnames")=List of 2
#######  .. .. ..$ : chr [1:4] "2" "3" "4" "5"
#######  .. .. ..$ : chr [1:3] "0" "1" "3"
#######  ..$ 50 : table [1:4, 1:3] 0 0 0 0 0 0 0 8.98 0 0.78 ...
#######  .. ..- attr(*, "dimnames")=List of 2
####### .. .. ..$ : chr [1:4] "2" "3" "4" "5"
#######  .. .. ..$ : chr [1:3] "0" "1" "3"
#######  ..$ 70 : table [1:3, 1:2] 0 0 20.76 0.47 2.85 ...
#######  .. ..- attr(*, "dimnames")=List of 2
#######  .. .. ..$ : chr [1:3] "3" "4" "5"
#######  .. .. ..$ : chr [1:2] "1" "3"
#######  ..$ 90 : table [1:3, 1:2] 0 0 2.93 0.08 0.2 0

##### lese die einzelnen Klassen aus und speichere diese zur Weiterverarbeitung in sep. csv.Files. 
klasse_14 <- lapply(tab_klasse, function(x) {list(x[["14"]]) })
sink("k14.csv")
print(klasse_14)
sink()

klasse_20 <- lapply(tab_klasse, function(x) {list(x[["20"]]) })
sink("k20.csv")
print(klasse_20)
sink()
So bekomme ich jetzt die gewünschten csv-Files und kann diese mit excel weiterverarbeiten bzw. mit Null ergänzen :) Danke nochmals!

Grüße
Jessi
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Variablen mit gleicher Endung zusammen führen

Beitrag von jogo »

Hallo Jessi,

Code: Alles auswählen

library("fortunes")
fortune(230)
ich kann nicht verstehen, warum Du das Datendesign nicht flach belässt (gemeint ist das Objekt Tab, siehe nachfolgenden Code), z.B.:

Code: Alles auswählen

library("data.table")

myf2 <- function(dat) {
  h1 <- read.csv(dat, header = TRUE, sep = "")
  #h1 <- read.csv(dat, header = TRUE, sep = ";")
  setDT(h1)[, Datei:=dat]
  h1[, .(Anzahl=.N), keyby=c("Datei", "Class", "Hoehenklassen", "Dichte")]
}
Tab <- rbindlist(lapply(files, myf2))

Tab[Class==14] ## nur diesen Teil zeigen
dcast(Tab[Class==14], Hoehenklassen ~ Dichte, value.var="Anzahl", fun.aggregate=sum) ## Beispiel einer Kreuztabelle
Meiner Meinung nach schneidest Du Dir die besten Möglichkeiten ab für das Jonglieren mit den Daten, indem Du frühzeitig Dich auf eine bestimmte Form (die Kreuztabelle) und eine Bestimmte Darstellung (nämlich die Berechnung der Prozente bezüglich einer Randsumme) festlegst.
Hier nochmal die obige Variante etwas weiter gesponnen:

Code: Alles auswählen

Tab <- rbindlist(lapply(files, myf2))
Tab[, Hkl :=factor(Hoehenklassen, levels=1:5)]
Tab[, Dkl :=factor(Dichte, levels=0:3)]

dcast(Tab, subset=(Class==14), Hkl ~ Dkl, value.var="Anzahl", fun.aggregate=sum, drop=FALSE)
#    Hkl 0   1 2 3
# 1:   1 0   0 0 0
# 2:   2 0   0 0 0
# 3:   3 0   0 0 8
# 4:   4 0   0 8 0
# 5:   5 0 189 0 0
Hier ist auch noch eine klassische Variante (also ohne data.table), die zeigt, wie man alle Daten beisammen hält:

Code: Alles auswählen

myf2 <- function(dat) {
  # h1 <- read.csv(dat, header = TRUE, sep = "")
  h1 <- read.csv(dat, header = TRUE, sep = ";")
  h1$Datei <- dat
  h1
}
alleDaten <- do.call(rbind, lapply(files, myf2))

alleDaten$Hkl <- factor(alleDaten$Hoehenklassen, levels=1:5)
alleDaten$Dkl <- factor(alleDaten$Dichte, levels=0:4)

with(alleDaten, tapply(Hoehen, list(Hkl, Dkl, Class), FUN=length))
Gruß, Jörg
p.s.:
Excel kann recht gut Pivottabellen anlegen und sogar per drag-and-drop modifizieren.
Es könnte also auch sehr gut sein, dass Du R nicht für die Auswertung verwenden musst.
Ich wollte dies anmerken, weil es scheint, als ob Deine 15 Dateien aus Excel stammen und Du nach kurzer Bearbeitung der Daten R ganz schnell die Ergebnisse wieder in Excel einlesen möchtest.
Antworten