2016-07-11 7 views
0

Ich arbeite derzeit mit Daten in einem * CSV. Ich habe bereits ein effektives Skript, um meine Daten zu plotten, aber ich stehe vor der scheinbar einfachsten Aufgabe. Ich versuche, ein Skript zu schreiben, das meine Daten (in Spalten angeordnet) aufnimmt und den Mittelwert nach Spalte berechnet und in ein neues Dokument schreibt (./ testAVG).Berechnen und schreiben Mittelwert und SD für Spalten in R

Auch ich versuche, die gleichen Daten zu nehmen, berechnen Sie die SD (nach Spalte) und fügen Sie diese Daten an das Ende des Originaldokuments (vorzugsweise in einer Wiederholung für die Gesamtzahl der Zeilen von Daten, die ich habe) .

Hier ist das Skript, das ich habe bisher:

#Number of lines with data 
Nlines = 5 
#Number of lines to skip 
Nskip = 0 

chem <- read.table("./test.csv", skip=Nskip, sep=",", col.names = c("Sample", "SiO2", "Al2O3", "FeO", "MgO", "CaO", "Na2O", "K2O", "Total", "eSiO2", "eAl2O3", "eFeO", "eMgO", "eCaO", "eNa2O", "eK2O"), fill=TRUE, header = TRUE, nrow=Nlines) 

sd1 <- sd(chem$SiO2) 
sd2 <- sd(chem$Al2O3) 
sd3 <- sd(chem$FeO) 
sd4 <- sd(chem$MgO) 
sd5 <- sd(chem$CaO) 
sd6 <- sd(chem$Na2O) 
sd7 <- sd(chem$K2O) 

avg1 <- colMeans(chem$SiO2, na.rm = FALSE, dims=1) 
avg2 <- colMeans(chem$Al2O3, na.rm = FALSE, dims=1) 
avg3 <- colMeans(chem$FeO, na.rm = FALSE, dims=1) 
avg4 <- colMeans(chem$MgO, na.rm = FALSE, dims=1) 
avg5 <- colMeans(chem$CaO, na.rm = FALSE, dims=1) 
avg6 <- colMeans(chem$Na2O, na.rm = FALSE, dims=1) 
avg7 <- colMeans(chem$K2O, na.rm = FALSE, dims=1) 

write <- write.table(sd1,sd2,sd3,sd4,sd5,sd6,sd7, file="./test.csv", append=TRUE, sep=",", dec=".", col.names = c("eSiO2", "eAl2O3", "eFeO", "eMgO", "eCaO", "eNa2O", "eK2O")) 

write <- write.table(avg1, avg2, avg3, avg4, avg5, avg6, avg7, file="./testAVG.csv", append=FALSE, sep=",", dec=".", col.names = c("Sample", "SiO2", "Al2O3", "FeO", "MgO", "CaO", "Na2O", "K2O", "Total")) 

Die Daten, die ich mit Arbeit bin dieses

Sample, SiO2, Al2O3, FeO, MgO, CaO, Na2O, K2O, Total,eSiO2,eAl2O3,eFeO,eMgO,eCaO,eNa2O,eK2O 
01,65.01,14.77,0.34,1.31,17.27,1.14,0.2,100,,,,,,, 
02,72.6,16.27,0.53,0.06,1.27,5.55,3.71,100,,,,,,, 
03,64.95,14.65,0.18,1.29,17.48,1.21,0.23,100,,,,,,, 
04,64.95,14.65,0.18,1.29,17.48,1.21,0.23,100,,,,,,, 

ist ich diesen Fehler:

Error in colMeans(chem$SiO2, na.rm = FALSE, dims = 1) : 
    'x' must be an array of at least two dimensions 

Irgendwelche Tipps? Dank

+0

Sie nicht 'write.table' wie folgt aufrufen können:' write.table (SD1, SD2, SD3, SD4, SD5, SD6, SD7, ...) '; Es braucht ein einzelnes Objekt ("x") zum Schreiben. Außerdem verwenden Sie 'colMeans' auf einem Vektor (' colMeans (chem $ SiO2, ...) '), aber es erwartet ein Array. Sie sollten wirklich die Dokumentation lesen ('? Write.table','? ColMeans'), es ist aus einem bestimmten Grund da. – nrussell

+1

Verwenden Sie die Funktionen 'apply' /' lapply'/'sapply'. – user2100721

+0

'colMeans' erwartet eine Matrix oder' dat.frame' nicht einen Vektor. Führen Sie 'colMeans (chem)' aus, um Mittelwerte für alle Spalten zu erhalten. –

Antwort

1

Die Kommentare bereits andeuten, wie es zu tun, aber es scheint, dass Sie ziemlich neu in R, so lassen Sie mich Ihnen explizit zeigen, wie man es besser machen könnte, mit dem mtcars-Datensatz:

df <- mtcars 

df_sd <- apply(df, 2, sd) # this is how to use apply. See ?apply 
df_avg <- colMeans(df) # this is how to use colMeans. See ?colMeans 

write.table(df_sd, file="test.csv")  # no assignment necessary. 
write.table(df_avg, file="testAVG.csv") # writing the file is a desired side effect... 

Darüber hinaus beachten sie bitte die folgende Zeile:

avg1 <- colMeans(chem$SiO2, na.rm = FALSE, dims=1) 

die kühle Sache über colMeans ist, dass es die spalten bedeutet für viele Spalten auf einmal berechnet. Hier liefern Sie nur einen Vektor, nämlich chem$SiO2. Wenn das wirklich ist, was Sie tun möchten, würden Sie gerade schreiben

avg1 <- mean(chem$SiO2)