Data.Frame vereinfachen

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

Moderatoren: EDi, jogo

Antworten
Uwi
Beiträge: 2
Registriert: Mi Aug 14, 2019 6:34 pm

Data.Frame vereinfachen

Beitrag von Uwi »

Hallo,
ich habe ein Problem bei dem ich nicht weiter komme.
ich habe einen Dataframe(df) der wie folgt aussieht:

Code: Alles auswählen

MolPerc			Name		Sample_Name
0,723117947750453	12:0		S1_and_pk_veg_1
0,046089710969517	12:0		S3_and_pk_veg_3
4,664022769640830	12:0		S19_lux_pk_veg_1
0,792319980905775	12:0		S20_lux_pk_veg_2
0,100690400314121	12:0		S21_lux_pk_veg_3
1,95202073928723	12:0		S22_lux_con_1
1,20986882371796	12:0		S26_eme_pk_veg_1
0,015568792253626	12:0		S39_hol_pk_gra_3
5,34343671539878	14:0		S2_and_pk_veg_2
1,51185521037698	14:0		S3_and_pk_veg_3
1,35878506814433	14:0		S5_and_pk_grz_2 
1,76210006075600	14:0		S13_and_pk_gra_2
1,82794586686593	14:0		S16_and_con_2
12,0743415293854	14:0		S19_lux_pk_veg_1
14,7363511213337	14:0		S20_lux_pk_veg_2
0,83263403772498	14:0		S21_lux_pk_veg_3
4,73522889279343	14:0		S22_lux_con_1
4,72836058510026	14:0		S23_lux_con_2
7,46591217346962	14:0		S25_lux_con_3
1,01126841130609	14:0		S28_eme_pk_veg_3
0,31756894204574	14:0		S29_eme_con_1
8,18829604882864	14:0		S31_eme_con_2
11,6309532486909	14:0		S32_eme_con_3
4,26023160565549	14:0		S33_hol_pk_veg_1
3,86034759755138	14:0		S34_hol_pk_veg_2
4,54779361187967	14:0		S35_hol_pk_veg_3
26,8266683027117	16:0		S1_and_pk_veg_1
14,6555021267382	16:0		S2_and_pk_veg_2
15,8949628089649	16:0		S3_and_pk_veg_3
17,5404923990519	16:0		S4_and_pk_grz_1 
17,6990270056518	16:0		S5_and_pk_grz_2  usw.
Es handelt sich hierbei um Messdaten (Mol%) für eine jeweilige Stoffgruppe (12:0, 14:0, 16:0 ... etc) an einem Probeort (S1_..., S2_..., etc).
Ich benötige für eine Hauptkomponentenanalyse einen Dataframe mit der Form

Code: Alles auswählen

		12:0			14:0			16:0				etc…
S1_and_pk_veg_1	0,723117947750453	0			26,8266683027117	
S2_and_pk_veg_2	0			5,34343671539878	14,6555021267382	
S3_and_pk_veg_3	0,046089710969517	1,51185521037698	15,8949628089649	
etc…				
Leider bekomme ich es nicht hin den Dataframe umzuformen, ich habe schon versucht mit

Code: Alles auswählen

listpca <- split(df, df$Sample_Name)
eine Liste zu erstellen die nach dem Sample_Name ordnet. Wie ich aber dabei weiter machen soll weiß ich nicht, ich habe noch nicht viel mit Listen gearbeitet. Mit einer Schleife die die verschiedenen Objekte in der Liste anspricht und als eigenen Dataframe abspeichert und dann einem bestehenden hinzufügt habe ich herumgespielt, bin aber leider zu keinem Ergebnis gekommen.
Außerdem habe ich die unsaubere Methode versucht einen neuen Dataframe zu erstellen und jeder Spalte und Zeile aus der alten etwas zuzuweisen:

Code: Alles auswählen

dfpca <- data.frame(
          Name = c("S1_and_pk_veg_1", ...
          MolPerc120 = c(df$MolPerc[which(df$Sample_Name == "S1_and_pk_veg_1" & df$Name == "12:0")], ... usw 
Das endet aber leider im Chaos, da ich viel zu viele Messdaten habe.

Ich hoffe jemand kann mir einen Tipp geben wie ich das Problem lösen kann. Ich bin über alles Dankbar und mein R-Wissen aus dem bisherigen Studium ist ausbaufähig.

Danke und schönen Abend,
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Data.Frame vereinfachen

Beitrag von jogo »

Hallo Uwi,
willkommen im Forum!
Das, was Du möchtest sieht aus wie ein reshape long to wide.
https://stackoverflow.com/questions/589 ... ide-format
Im einfachsten Fall kann die Funktion xtabs() das erledigen.
Ich habe mal etwas vorbereitet:

Code: Alles auswählen

df <- read.table(header=TRUE, stringsAsFactors = FALSE, dec=",", text=
"MolPerc			Name		Sample_Name
0,723117947750453	12:0		S1_and_pk_veg_1
0,046089710969517	12:0		S3_and_pk_veg_3
4,664022769640830	12:0		S19_lux_pk_veg_1
0,792319980905775	12:0		S20_lux_pk_veg_2
0,100690400314121	12:0		S21_lux_pk_veg_3
1,95202073928723	12:0		S22_lux_con_1
1,20986882371796	12:0		S26_eme_pk_veg_1
0,015568792253626	12:0		S39_hol_pk_gra_3
5,34343671539878	14:0		S2_and_pk_veg_2
1,51185521037698	14:0		S3_and_pk_veg_3
1,35878506814433	14:0		S5_and_pk_grz_2 
1,76210006075600	14:0		S13_and_pk_gra_2
1,82794586686593	14:0		S16_and_con_2
12,0743415293854	14:0		S19_lux_pk_veg_1
14,7363511213337	14:0		S20_lux_pk_veg_2
0,83263403772498	14:0		S21_lux_pk_veg_3
4,73522889279343	14:0		S22_lux_con_1
4,72836058510026	14:0		S23_lux_con_2
7,46591217346962	14:0		S25_lux_con_3
1,01126841130609	14:0		S28_eme_pk_veg_3
0,31756894204574	14:0		S29_eme_con_1
8,18829604882864	14:0		S31_eme_con_2
11,6309532486909	14:0		S32_eme_con_3
4,26023160565549	14:0		S33_hol_pk_veg_1
3,86034759755138	14:0		S34_hol_pk_veg_2
4,54779361187967	14:0		S35_hol_pk_veg_3
26,8266683027117	16:0		S1_and_pk_veg_1
14,6555021267382	16:0		S2_and_pk_veg_2
15,8949628089649	16:0		S3_and_pk_veg_3
17,5404923990519	16:0		S4_and_pk_grz_1 
17,6990270056518	16:0		S5_and_pk_grz_2")

xtabs(MolPerc ~ Sample_Name + Name, data=df)
Hier ist eine Version mit reshape():

Code: Alles auswählen

reshape(df, idvar = "Sample_Name", timevar = "Name", direction = "wide")
Hier ist eine Version mit data.table:

Code: Alles auswählen

library("data.table")
dcast(setDT(df), Sample_Name ~ Name, value.var = "MolPerc")
und hier eine Version mit tidyr:

Code: Alles auswählen

library("tidyr")
df %>% spread(key = Name, value = MolPerc)
Gruß, Jörg
Uwi
Beiträge: 2
Registriert: Mi Aug 14, 2019 6:34 pm

Re: Data.Frame vereinfachen

Beitrag von Uwi »

Danke dir Jörg,
hat perfekt funktioniert mit reshape!

Grüße
Antworten