Seite 1 von 1

Erstellung eines Loops zur Übertragung von Daten

Verfasst: Mo Jan 16, 2017 4:57 pm
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

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

Verfasst: Mo Jan 16, 2017 6:02 pm
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

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

Verfasst: Di Jan 17, 2017 8:26 am
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 :)

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

Verfasst: Di Jan 17, 2017 8:49 am
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

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

Verfasst: Di Jan 17, 2017 9:32 am
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?

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

Verfasst: Di Jan 17, 2017 10:02 am
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

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

Verfasst: Di Jan 17, 2017 10:25 am
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

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

Verfasst: Di Jan 17, 2017 11:44 am
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

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

Verfasst: Do Jan 19, 2017 8:07 am
von studentin_09
Hallo Jörg,

danke für deine Hilfe! Es klappt super!

Viele Grüße
Studentin_09

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

Verfasst: Do Jan 19, 2017 1:45 pm
von jogo
:D prima