Erstellung eines Loops zur Übertragung von Daten

Varianzanalyse, Diskriminanzanalyse, Kontingenzanalyse, Faktorenanalyse, Clusteranalyse, MDS, ....

Moderator: EDi

Antworten
studentin_09

Erstellung eines Loops zur Übertragung von Daten

Beitrag von studentin_09 »

Hallo,

ich arbeite derzeit mit R, wobei es um die multivariate Statistik bei NIR-Untersuchungen geht.

Die NIR-Daten nehme ich aus einer SQLite-Datenbank, in der z.B. 200 Proben und die NIR-Daten dieser 200 Proben enthalten sind. Die NIR-Daten aller Proben stehen in SQLite jedoch alle nebeneinander, durch Kommas getrennt, in einer Zeile (und nicht pro Wellenlänge eine Spalte). Daher habe ich zunächst den String auseinander genommen, um im Anschluss ein data.frame df zu erstellen, in das die NIR-Daten eingetragen werden sollen.

Hier kommt meine Frage: Bisher habe ich es nur geschafft, die NIR-Daten jeder Probe einzeln nacheinander mit dem folgenden Befehl in das data.frame df aufzunehmen:

for (i in 1:180) {df[1,i] <- sp }

Bei 200 Proben ist das aber ziemlich umständlich, die NIR-Daten aller Proben einzeln nacheinander in das Data.frame aufzunehmen. Gibt es die Möglichkeit, für alle 200 Proben alle NIR-Daten mit einem Klick in das data.frame aufzunehmen? Irgendwie mit einem Loop?

Vielen Dank für Eure Hilfe vorab!! :)

Viele Grüße,
studentin_09
Zuletzt geändert von studentin_09 am Fr Jan 20, 2017 10:26 am, insgesamt 1-mal geändert.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Hilfe bei der Erstellung eines Loops zur Übertragung von Daten in ein data.frame

Beitrag von EDi »

Like this?

Code: Alles auswählen

sp <- 1:10
data.frame(t(sp))

## X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
## 1  1  2  3  4  5  6  7  8  9  10
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
studentin_09

Re: Hilfe bei der Erstellung eines Loops zur Übertragung von Daten in ein data.frame

Beitrag von studentin_09 »

Hey EDi,

nein, leider meinte ich das nicht.

Ich lade zunächst die RSQLite Bibliothek und verknüpfe diese mit R. Meine Daten nehme ich aus einer SQLite Datenbank. Nur in SQLite sind meine Proben so dargestellt, dass in einer Spalte die Probennummer steht und in der anderen Spalte z.B. 180 Absorptionswerte des NIR-Spektrums stehen. Daher muss ich die NIR-Werte erstmal in separate Spalten packen und den String auseinander packen. Zunächst lade ich die Daten von Probe 1. Danach lass ich mir für Probe 1 die NIR-Werte anzeigen:

Code: Alles auswählen

stg <- samples$value
Die 180 NIR-Daten von Probe 1 werden ausgelesen:

Code: Alles auswählen

Probe1 <- split(stg,180)
Das muss ich bisher für alle 200 Proben einzeln machen, was sehr zeitintensiv ist. Gibt es eine Möglichkeit, diese ganzen Schritte direkt für alle 200 Proben gleichzeitig zu machen?

Danke :)
Zuletzt geändert von studentin_09 am Fr Jan 20, 2017 10:28 am, insgesamt 4-mal geändert.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Hilfe bei der Erstellung eines Loops zur Übertragung von Daten in ein data.frame

Beitrag von jogo »

Hallo studentin_09,

willkommen im Forum. Kannst Du uns das Ergebnis von

Code: Alles auswählen

dput(Pr_1)
in Deiner nächsten Nachricht zukommen lassen? ... oder die Datei Pr_1_out.txt nach Ausführung von:

Code: Alles auswählen

dput(Pr_1, file="Pr_1_out.txt")
Gruß, Jörg
studentin_09

Re: Hilfe bei der Erstellung eines Loops zur Übertragung von Daten in ein data.frame

Beitrag von studentin_09 »

Hallo Jörg,

hier der Output:

Code: Alles auswählen

structure(list(sampleID = 1L, value = "1.1383,1.1664,1.1603,1.1526,1.1478,1.1426,1.1230,1.1079,1.0813,1.0798,1.0765,1.0799,1.0645,1.1013,1.0524,1.0463,0.9950,0.9670,0.9149,0.8953,0.8511,0.8514,0.8113,0.7889,0.7516,0.7451,0.7242,0.7009,0.6841,0.6589,0.6412,0.6399,0.6148,0.6006,0.5719,0.5465,0.5511,0.5235,0.5466,0.5124,0.5122,0.5100,0.4788,0.4801,0.4723,0.4556,0.4529,0.4397,0.4386,0.4125,0.4267,0.4241,0.4174,0.4165,0.4096,0.4052,0.4031,0.3785,0.3812,0.3755,0.3813,0.3781,0.3739,0.3755,0.3700,0.3663,0.3578,0.3628,0.3598,0.3565,0.3571,0.3563,0.3598,0.3564,0.3575,0.3603,0.3600,0.3651,0.3644,0.3678,0.3758,0.3763,0.3756,0.3791,0.3799,0.3790,0.3758,0.3713,0.3664,0.3628,0.3587,0.3542,0.3524,0.3502,0.3482,0.3461,0.3458,0.3426,0.3343,0.3409,0.3488,0.3818,0.3589,0.3583,0.3762,0.3818,0.3870,0.3960,0.4023,0.4249,0.4514,0.4567,0.4756,0.5091,0.5263,0.5467,0.5623,0.5688,0.5719,0.5668,0.5674,0.5602,0.5546,0.5486,0.5415,0.5353,0.5308,0.5242,0.5205,0.5214,0.5116,0.5148,0.5114,0.5109,0.5068,0.5024,0.4986,0.4965,0.4938,0.4935,0.4763,0.4908,0.4928,0.4944,0.4956,0.5017,0.5051,0.5105,0.5133,0.5091,0.5231,0.5265,0.5308,0.5310,0.5283,0.5285,0.5223,0.5292,0.5309,0.5282,0.5268,0.5271,0.5225,0.5200,0.5176,0.5166,0.5163,0.5131,0.5104,0.5088,0.5064,0.5044,0.5039,0.5034,0.5027,0.0000", 
    type = "NIR"), .Names = c("sampleID", "value", "type"), row.names = c(NA, 
-1L), class = "data.frame")
Hilft das zur Lösung meines Problems?
Zuletzt geändert von jogo am Di Jan 17, 2017 9:41 am, insgesamt 1-mal geändert.
Grund: Output formatiert
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Hilfe bei der Erstellung eines Loops zur Übertragung von Daten in ein data.frame

Beitrag von jogo »

studentin_09 hat geschrieben:Hallo Jörg,

hier der Output: ...
Hilft das zur Lösung meines Problems?
ja, das hilft ungemein. Zumindest kann ich jetzt schon:

Code: Alles auswählen

Pr_1 <- structure(list(sampleID = 1L, value = "1.1383,1.1664,1.1603,1.1526,1.1478,1.1426,1.1230,1.1079,1.0813,1.0798,1.0765,1.0799,1.0645,1.1013,1.0524,1.0463,0.9950,0.9670,0.9149,0.8953,0.8511,0.8514,0.8113,0.7889,0.7516,0.7451,0.7242,0.7009,0.6841,0.6589,0.6412,0.6399,0.6148,0.6006,0.5719,0.5465,0.5511,0.5235,0.5466,0.5124,0.5122,0.5100,0.4788,0.4801,0.4723,0.4556,0.4529,0.4397,0.4386,0.4125,0.4267,0.4241,0.4174,0.4165,0.4096,0.4052,0.4031,0.3785,0.3812,0.3755,0.3813,0.3781,0.3739,0.3755,0.3700,0.3663,0.3578,0.3628,0.3598,0.3565,0.3571,0.3563,0.3598,0.3564,0.3575,0.3603,0.3600,0.3651,0.3644,0.3678,0.3758,0.3763,0.3756,0.3791,0.3799,0.3790,0.3758,0.3713,0.3664,0.3628,0.3587,0.3542,0.3524,0.3502,0.3482,0.3461,0.3458,0.3426,0.3343,0.3409,0.3488,0.3818,0.3589,0.3583,0.3762,0.3818,0.3870,0.3960,0.4023,0.4249,0.4514,0.4567,0.4756,0.5091,0.5263,0.5467,0.5623,0.5688,0.5719,0.5668,0.5674,0.5602,0.5546,0.5486,0.5415,0.5353,0.5308,0.5242,0.5205,0.5214,0.5116,0.5148,0.5114,0.5109,0.5068,0.5024,0.4986,0.4965,0.4938,0.4935,0.4763,0.4908,0.4928,0.4944,0.4956,0.5017,0.5051,0.5105,0.5133,0.5091,0.5231,0.5265,0.5308,0.5310,0.5283,0.5285,0.5223,0.5292,0.5309,0.5282,0.5268,0.5271,0.5225,0.5200,0.5176,0.5166,0.5163,0.5131,0.5104,0.5088,0.5064,0.5044,0.5039,0.5034,0.5027,0.0000",   
    type = "NIR"), .Names = c("sampleID", "value", "type"), row.names = c(NA,   
-1L), class = "data.frame")
strsplit(Pr_1$value, ",", fixed = TRUE)
as.numeric(strsplit(Pr_1$value, ",", fixed = TRUE)[[1]])
Wieviele Datensätze hat denn die Tabelle tor der SQLite-Datenbank?
Ist für jeden Wert von sampleid genau ein Datensatz vorhanden?
Sind immer jeweils die gleiche Anzahl von Absorptionswerten in eine Zeichenkette gepackt? (176 Stück, ist das richtig?)

noch eine Bitte:
lies demnächst, wie man Codestücke u.a. hier in den Forumsnachrichten formatiert: viewtopic.php?f=20&t=29
(Deine bisherigen Nachrichten habe ich bereits editiert.)

Gruß, Jörg
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Hilfe bei der Erstellung eines Loops zur Übertragung von Daten in ein data.frame

Beitrag von jogo »

Hallo studentin_09,

normalerweise würdest Du alle interessierenden Datensätze in einem Rutsch aus der SQLite-Datenbank holen. Ich behelfe mich derzeit so:

Code: Alles auswählen

Pr_123 <- rbind(Pr_1, Pr_1, Pr_1)
um mehrere Datensätze zu erzeugen.

Dann geht:

Code: Alles auswählen

S <- strsplit(Pr_123$value, ",", fixed = TRUE)
M <- matrix(unlist(S), ncol=176, byrow = TRUE)
m <- matrix(as.numeric(unlist(S)), ncol=176, byrow = TRUE) # oder nrow=length(S)
colnames(m) <- paste0("NIR.", 1:176) # 1:ncol(m)

neuDat <- cbind(Pr_123[, "sampleID", drop=FALSE], m)
Bei Dir könnte das dann so aussehen:

Code: Alles auswählen

Pr <- dbGetQuery( con,'select * from tor' ) 
S <- strsplit(Pr$value, ",", fixed = TRUE)
neuDat <- cbind( Pr[, "sampleID", drop=FALSE],
   matrix(as.numeric(unlist(S)), nrow=length(S), byrow = TRUE, dimnames = list(NULL, paste0("NIR.", seq(S[[1]]))))
)
oder

Code: Alles auswählen

Pr <- dbGetQuery( con,'select * from tor' ) 
S  <- strsplit(Pr$value, ",", fixed = TRUE)
neuDat <- matrix(as.numeric(unlist(S)), nrow=length(S), byrow = TRUE, 
          dimnames = list(Pr$sampleID, paste0("NIR.", seq(S[[1]]))))
Dann bekommt man erstmal eine Matrix.

Gruß, Jörg
studentin_09

Re: Hilfe bei der Erstellung eines Loops zur Übertragung von Daten in ein data.frame

Beitrag von studentin_09 »

Hallo Jörg,

vielen Dank. Ich werde das mal versuchen!
Sorry wegen der Formatierung, war keine böse Absicht!

Viele Grüße
Studentin_09
Zuletzt geändert von studentin_09 am Fr Jan 20, 2017 10:20 am, insgesamt 2-mal geändert.
studentin_09

Re: Hilfe bei der Erstellung eines Loops zur Übertragung von Daten in ein data.frame

Beitrag von studentin_09 »

Hallo Jörg,

danke für deine Hilfe! Es klappt super!

Viele Grüße
Studentin_09
Zuletzt geändert von studentin_09 am Fr Jan 20, 2017 10:19 am, insgesamt 1-mal geändert.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Hilfe bei der Erstellung eines Loops zur Übertragung von Daten in ein data.frame

Beitrag von jogo »

:D prima
Antworten