[R] coercing a list to a data frame, lists in foreloops

Benjamin M. Osborne Benjamin.Osborne at uvm.edu
Mon Jan 31 20:46:01 CET 2005


I have a set of time-series climate data with missing entries.  I need to add
rows for these missing entries to this data set.  The only way I know to do
this is unsing a foreloop, but this won't work on a list.  I've tried to
convert the list to a data frame, but that won't happen, either.

I want to fill rows in this table:

> newtest[10:15,]
    yrmos yearmo snow.sum snow.mean snow.dep.mean prcp.sum prcp.mean tmin.min
10 195410     NA       NA        NA            NA       NA        NA       NA
11 195411     NA       NA        NA            NA       NA        NA       NA
12 195412     NA       NA        NA            NA       NA        NA       NA
13 195501     NA       NA        NA            NA       NA        NA       NA
14 195502     NA       NA        NA            NA       NA        NA       NA
15 195503     NA       NA        NA            NA       NA        NA       NA
   tmin.mean tmax.max tmax.mean tmean.mean
10        NA       NA        NA         NA
11        NA       NA        NA         NA
12        NA       NA        NA         NA
13        NA       NA        NA         NA
14        NA       NA        NA         NA
15        NA       NA        NA         NA
>

from this one:

> mansNew[10:15,]
   yearmo snow.sum snow.mean snow.dep.mean prcp.sum prcp.mean  tmin.min
10 195508    0.000 0.0000000       0.00000  29.5910 0.9545484        NA
11 195509    0.000 0.0000000       0.00000   9.1948 0.3064933        NA
12 195510   20.320 0.6554839            NA  13.8684 0.4473677        NA
13 195511       NA        NA            NA       NA        NA -18.88889
14 195512   52.324 1.6878710      53.01226   6.4770 0.2089355        NA
15 195601   46.736 1.5076129            NA   8.0264 0.2589161        NA
   tmin.mean   tmax.max  tmax.mean tmean.mean
10        NA         NA         NA         NA
11        NA         NA         NA         NA
12        NA         NA         NA         NA
13  -8.62963 12.2222222 -0.6481481  -4.638889
14        NA -0.5555556 -9.3906810         NA
15        NA         NA         NA         NA
>
This may be a problem:
> newtest<-as.data.frame(newtest)
> mode(newtest)  ## returns "list"
[1] "list"
>
> mansNew<-as.data.frame(mansNew)
> mode(mansNew)  ## returns "list"
[1] "list"
>
I've checked to make sure each column is a vector, but the coercion still is not
allowed.

This is the code with which I'm attempting to perform this manipulation, as well
as the result:

> for (i in 1:100){
+ newtest[i,2:12]<-ifelse(is.element(newtest$yrmos[i],mansNew$yearmo),
subset(mansNew, yearmo == newtest$yrmos[i])[,1:11], c(rep(NA,11)))
+ }
> newtest[10:15,]
    yrmos yearmo snow.sum snow.mean snow.dep.mean prcp.sum prcp.mean tmin.min
10 195410     NA       NA        NA            NA       NA        NA       NA
11 195411 195411   195411    195411        195411   195411    195411   195411
12 195412 195412   195412    195412        195412   195412    195412   195412
13 195501 195501   195501    195501        195501   195501    195501   195501
14 195502 195502   195502    195502        195502   195502    195502   195502
15 195503 195503   195503    195503        195503   195503    195503   195503
   tmin.mean tmax.max tmax.mean tmean.mean
10        NA       NA        NA         NA
11    195411   195411    195411     195411
12    195412   195412    195412     195412
13    195501   195501    195501     195501
14    195502   195502    195502     195502
15    195503   195503    195503     195503
>

subset...  should return only one row.  This may be a simple comma problem, but
I think it has something to do with the lists.  Also, if there is a way to do
this without the foreloop, I'd be happy to hear about it.
Any suggestions will be appreciated.

Thanks,
Ben Osborne

-- 
Botany Department
University of Vermont
109 Carrigan Drive
Burlington, VT 05405

benjamin.osborne at uvm.edu
phone: 802-656-0297
fax: 802-656-0440




More information about the R-help mailing list