[R] Loop

Matevž Pavlič matevz.pavlic at gi-zrmk.si
Thu Nov 4 21:31:36 CET 2010


Hi again, 

Stil don't qute get it...

Here's what i did : 

>mat<-read.csv("litologija.csv", dec=".", sep=";")
>apply(mat, 2, function(x) head(sort(table(x),decreasing=T),10))

With that i get a table(list/matrix...) which gives the highest count of occurances of each value in a table (at least i think so) 
But the problem is because it does not tell which value occurs the most (has the highest count). 

If written like this :
>apply(mat, 2, function(x) sort(table(x),decreasing=T))


I get decreasingly sorted values of counts of occurances of a specific field and the value of that field for each column:


$W2
x
         PEŠČEN       GRADUIRAN              IN            PROD              DO         GLINAST           PROD,        PREPEREL         MELJAST           GRUŠČ           GLINA               Z            MALO     GRANULIRANA 
           1872            1542             552             519             458             214             175             174             132             114              62              53              47              45 
           ZELO         PEŠČENA       ZAGLINJEN      KARBONATNI      SKRILAVCA,               S       SKRILAVCA      GRANULIRAN          PEČŠEN           VEZAN        ZAOBLJEN             GR.          DROBEN           SLABO 
             40              34              31              26              26              25              25              24              17              17              17              15              12              12 
         GRUŠČ,        MELJASTO          PEŠEEN           DOBRO           GRAN.      PEŠČENJAKA     HUDOURNIŠKI          MELJNA           PEŠČN      GIRADUIRAN        GLINAST,            GOST       GRADUTRAN         GRANUL. 
             11              11              11              10              10               9               8               8               8               6               6               6               6               6 
          PESEK        ZAMELJEN       GRADUIPAN        PREPEPEL           PŠČEN       GPADUIRAN      GRADUIRAN,        GRADURAN         POTOČNI         PREPERL          SAVSKI            CONA      GLINASTEGA        GRADUIRN 
              6               6               5               5               5               4               4               4               4               4               4               3               3               3 
       MELJAST,           PEČEN         PEŠČEN,          PLASTI                           DELNO          GLINA,        GLINASTO        GRADUIAN       GRADULRAN        GRDUIRAN          GRUŠČ.           KARB.     KONGLOMERAT 
              3               3               3               3               2               2               2               2               2               2               2               2               2               2 
   KONGLOMERAT,            MELJ        NEKOLIKO            OKER          PESEK,         PEŠČCEN         PEŠČEN.         PLASTEH             POD        PPEPEREL            RPOD          UMAZAN       ZAOBLJEN,               - 
              2               2               2               2               2               2               2               2               2               2               2               2               2               1 
        (GRUŠČ)    (KARBONATNI)         APNENCA    DROBNOZRNAT,      ENAKOMEREN       GBADUIRAN        GLIANAST        GLINASTA      GPADUIRALN           GPUŠČ      GRADAUIRAN        GRADUIRA GRADUIRANPEŠČEN       GRADUIRAU


But the first code somhove looses the acutal value of the field and just gives the count 
>apply(mat, 2, function(x) head(sort(table(x),decreasing=T),10))

VrtinaID ZapStev GlobinaOd GlobinaDo USCS Opis   W1   W2   W3   W4   W5   W6   W7  W8  W9  W10  W11  W12  W13  W14  W15
 [1,]       15    1248       282       290 2131   15 1820 1872 1677 1479 1441 1465 1261 769 848 1088 1490 1968 2459 2943 3408
 [2,]       11    1119       198       235 1305   13 1791 1542 1495 1334 1317 1247  829 652 783  660  606  603  381  381  301
 [3,]       11    1078       174       210  784   11  532  552  566  529  532  716  511 575 576  416  464  384  368  282  279
 [4,]       11     835       147       173  691   11  471  519  390  351  358  571  364 521 556  381  398  352  287  282  259
 [5,]       10     584       133       172  646   11  376  458  296  311  323  195  252 329 429  343  397  336  244  242  224
 [6,]       10     389       123       142  386   10  253  214  237  268  310  130  233 265 376  263  378  258  228  210  205
 [7,]       10     257       114       130  183   10  247  175  201  242  157  130  179 258 267  219  230  239  197  185  155
 [8,]        9     198       105       126  148    9  135  174  157  170  146  102  163 213 266  215  221  188  197  179  155
 [9,]        9     171       101        95   71    9  102  132  139  161  141   89  145 199 140  192  205  168  191  160  122
[10,]        9     144        94        91   31    8   93  114  124  158  121   84  136 183 134  185  160  158  181  155  115


How would i get the count and the actual value of the field in the same table so that it would look something like this :
VrtinaID.count VrtinaID.value	 ZapStev.count ZapStev.value
 [1,]       15    	V-1 	1248      ena  ...
[2,]       11   	V-12 	1119      dva  ...
.
.
.

Hope that explains it and thanks for help, 

 m

.
str(w)

-----Original Message-----
From: Petr PIKAL [mailto:petr.pikal at precheza.cz] 
Sent: Thursday, November 04, 2010 4:56 PM
To: Matevž Pavlič
Cc: r-help at r-project.org
Subject: Re: [R] Loop

Hi

r-help-bounces at r-project.org napsal dne 04.11.2010 15:49:31:

> Hi all, 
> 
> I understand that you most of you this is a peice of cake but i am a 
complete 
> newbie in this....so any example would be greatly aprpeciated and also 
any 
> hint as how to get around in R. Frankly i sometimes see the help files 
kinda confusing.

OK. Instead of 
> > >> w1<-table(lit$W1)
> > >> w1<-as.data.frame(w1)
> > >> write.table(w1,file="w1.csv",sep=";",row.names=T, dec=".")
> > >> w1<- w1[order(w1$Freq, decreasing=TRUE),] w1<-head(w1, 20)

Suppose you have data frame or matrix, and you want to have 5 most common 
values from each column

# prepare matrix
x<-sample(1:20, 1000000, replace=T)
mat<-matrix(x, ncol=10)

#apply user defined function for each column
apply(mat, 2, function(x) head(sort(table(x), decreasing=T),5))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 5091 5135 5174 5133 5199 5097 5165 5157 5134  5068
[2,] 5073 5111 5143 5064 5113 5078 5102 5157 5131  5065
[3,] 5058 5092 5115 5051 5079 5064 5088 5128 5076  5063
[4,] 5056 5073 5114 5047 5059 5044 5037 5064 5071  5063
[5,] 5047 5064 5072 5041 5057 5041 5035 5058 5032  5061

If you want to do it in loop (can be quicker sometimes) and save it to 
list make a list

lll<-vector("list", 10)

and fill it with your results

for (i in 1:10) lll[[i]]<-head(sort(table(mat[,i]), decreasing=T),5)

and now you can call values from this lll list simply by

lll[5]
[[1]]

   9   15   13    6   16 
5199 5113 5079 5059 5057 

lll[[5]]

   9   15   13    6   16 
5199 5113 5079 5059 5057

or even

lll[[5]][3]
  13 
5079

without need for writing to individual files pasting together letters and 
numbers etc. 

There shall be R-intro document in your installation and it is worth 
reading. It is not so big, you can manage it in less then month if you 
complete more than 3 pages per day.

Regards
Petr



> 
> M
> 
> -----Original Message-----
> From: Petr PIKAL [mailto:petr.pikal at precheza.cz] 
> Sent: Thursday, November 04, 2010 3:40 PM
> To: Matevž Pavlič
> Cc: r-help at r-project.org
> Subject: Re: [R] Loop
> 
> Hi
> 
> r-help-bounces at r-project.org napsal dne 04.11.2010 14:21:38:
> 
> > Hi David,
> > 
> > I am still having troubles with that loop ...
> > 
> > This code gives me (kinda) the name of the column/field in a data 
frame. 
> Filed
> > names are form W1-W10. But there is a space between W and a number -->
> "W 10",
> > and column (field) names do not contain numbers. 
> > 
> > >for(i in 1:10)
> > >{
> > >vari <- paste("W",i)
> > >}
> > >vari
> > 
> > [1] "W 10"
> > 
> > Now as i understand than i would call different columns to R with
> > 
> > >w<-lit[[vari]]
> > 
> > Or am i wrong again?
> > 
> > Then I would probably need another loop to create the names of the
> variables 
> > on R, i.e. w1 to w10. Is that a general idea for the procedure?
> 
> Beware of such loops. Instead of littering your workspace with 
files/objects 
> constructed by some paste(whatever, i) solution you can save results in 
list 
> or data.frame or matrix and simply use basic subsetting procedures or 
lapply/
> sapply functions.
> 
> I must say I never used such paste(...) construction yet and I work with 
R for
> quite a long time.
> 
> Regards
> Petr
> 
> 
> > 
> > 
> > Thank for the help, m
> > 
> > -----Original Message-----
> > From: David Winsemius [mailto:dwinsemius at comcast.net]
> > Sent: Wednesday, November 03, 2010 10:41 PM
> > To: Matevž Pavlič
> > Cc: r-help at r-project.org
> > Subject: Re: [R] Loop
> > 
> > 
> > On Nov 3, 2010, at 5:03 PM, Matevž Pavlič wrote:
> > 
> > > Hi,
> > >
> > > Thanks for the help and the manuals. Will come very handy i am sure.
> > >
> > > But regarding the code i don't hink this is what i want....basically 

> > > i
> 
> > > would like to repeat bellow code :
> > >
> > > w1<-table(lit$W1)
> > > w1<-as.data.frame(w1)
> > 
> > It appears you are not reading for meaning. Burns has advised you how 
> > to
> 
> > construct column names and use them in your initial steps. The `$`
> function is
> > quite limited in comparison to `[[` , so he was showing you a method
> that 
> > would be more effective.  BTW the as.data.frame step is unnecessary,
> since the
> > first thing write.table does is coerce an object to a data.frame. The 
> > "write.table" name is misleading. It should be "write.data.frame". You
> cannot 
> > really write tables with write.table.
> > 
> > You would also use:
> > 
> >   file=paste(vari, "csv", sep=".") as the file argument to write.table
> > 
> > > write.table(w1,file="w1.csv",sep=";",row.names=T, dec=".")
> > 
> > What are these next actions supposed to do after the file is written? 
> > Are you trying to store a group of related "w" objects that will later
> be 
> > indexed in sequence? If so, then a list would make more sense.
> > 
> > --
> > David.
> > 
> > > w1<- w1[order(w1$Freq, decreasing=TRUE),] w1<-head(w1, 20)
> > >
> > > 20 times, where W1-20 (capital letters) are the fields in a 
> > > data.frame
> 
> > > called "lit" and w1-20 are the data.frames being created.
> > >
> > > Hope that explains it better,
> > 
> > > m
> > >
> > > -----Original Message-----
> > > From: Patrick Burns [mailto:pburns at pburns.seanet.com]
> > > Subject: Re: [R] Loop
> > >
> > > If I understand properly, you'll want something like:
> > >
> > > lit[["w2"]]
> > >
> > > instead of
> > >
> > > lit$w2
> > >
> > > more accurately:
> > >
> > > for(i in 1:20) {
> > > vari <- paste("w", i)
> > > lit[[vari]]
> > >
> > > ...
> > > }
> > >
> > > The two documents mentioned in my
> > > signature may help you.
> > >
> > > On 03/11/2010 20:23, Matevž Pavlič wrote:
> > >> Hi all,
> > >>
> > >> I managed to do what i want (with the great help of thi mailing
> > >> list)  manually . Now i would like to automate it. I would probably 

> > >> need a for loop for to help me with this...but of course  I have no 

> > >> idea how to do that in R.  Bellow is the code that i would like to 
> > >> be
> 
> > >> replicated for a number of times (let say 20). I would like to 
> > >> achieve  that w1 would change to w2, w3, w4 ... up to w20 and by 
> > >> that
> 
> > >> create 20 data.frames that I would than bind together with cbind.
> > >>
> > >> (i did it like shown bellow -manually)
> > >>
> > >> w1<-table(lit$W1)
> > >> w1<-as.data.frame(w1)
> > >> write.table(w1,file="w1.csv",sep=";",row.names=T, dec=".")
> > >> w1<- w1[order(w1$Freq, decreasing=TRUE),] w1<-head(w1, 20)
> > >>
> > >> w2<-table(lit$W2)
> > >>
> > >> w2<-as.data.frame(w2)
> > >>
> > >> write.table(w2,file="w2.csv",sep=";",row.names=T, dec=".")
> > >>
> > >> w2<- w2[order(w2$Freq, decreasing=TRUE),]
> > >>
> > >> w2<-head(w2, 20)
> > >> .
> > >> .
> > >> .
> > >>
> > >> Thanks for the help,m
> > 
> > >
> > 
> > David Winsemius, MD
> > West Hartford, CT
> > 
> > ______________________________________________
> > R-help at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide 
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list