[R] Erroneous Column Removing Result From User-Defined Function.....
Jeff Newmiller
jdnewmil at dcn.davis.ca.us
Wed Dec 25 20:15:10 CET 2013
You have pasted together a string, and are now trying to treat it as a
data frame? I am not surprised at this error message.
Please take heed of this warning: you are in Circle 6 of the R Inferno
[1], and would benefit greatly from learning to put your
multiple-but-similarly-structured data into a list and returning the list
from the function instead of mucking around in the global environment. [2]
[1] http://www.burns-stat.com/pages/Tutor/R_inferno.pdf
[2] Example:
MyFunction <- function ( dyolu, dadi, dsayi ) {
# integer sequence up to dsayi
dsayiseq <- seq.int( dsayi )
# vector of names
ad <- paste( dadi, dsayiseq, sep="" )
# vector of filenames based on ad
yol <- paste( dyolu, ad, ".csv", sep="" )
# generate list of data frames, one filename at a time
result <- lapply( yol
, function( yoli ) {
# avoid using "T" and "F"... they are variables
# that can be re-defined... instead use TRUE and
# FALSE
dta <- read.csv( yoli, sep=";", dec=","
, header=TRUE )
# note that accessing columns by position is a
# brittle approach...
# if a new column is inserted, this code will
# break. Would be better to use column names
dta <- dta[,-12]
# dta is a local variable... as the result of this
# inner function, its value is stored in the result
# list
dta
}
)
# name the elements of the list for easier access
names( result ) <- ad
result
}
# make example reproducible
set.seed( 42 )
# create fake files to test code with
for ( i in 1:5 ) {
m <- matrix( runif( 150 ), nrow=10 )
colnames( m ) <- paste0( "Col", 1:15 )
samp <- data.frame( key=1:10, m )
write.csv2( samp, paste0( "Fnameprefix", "Dtaprefix", i, ".csv" )
, row.names=FALSE )
}
dtaList <- MyFunction( "Fnameprefix", "Dtaprefix", 5 )
> str( dtaList, 1 )
List of 5
$ Dtaprefix1:'data.frame': 10 obs. of 15 variables:
$ Dtaprefix2:'data.frame': 10 obs. of 15 variables:
$ Dtaprefix3:'data.frame': 10 obs. of 15 variables:
$ Dtaprefix4:'data.frame': 10 obs. of 15 variables:
$ Dtaprefix5:'data.frame': 10 obs. of 15 variables:
> str( dtaList[[ 2 ]] )
'data.frame': 10 obs. of 15 variables:
$ key : int 1 2 3 4 5 6 7 8 9 10
$ Col1 : num 0.719 0.324 0.779 0.394 0.679 ...
$ Col2 : num 0.935 0.55 0.602 0.197 0.535 ...
$ Col3 : num 0.73 0.412 0.414 0.48 0.427 ...
$ Col4 : num 0.918 0.863 0.317 0.259 0.742 ...
$ Col5 : num 0.1947 0.7841 0.1289 0.1291 0.0723 ...
$ Col6 : num 0.885 0.517 0.852 0.443 0.158 ...
$ Col7 : num 0.542 0.6499 0.3364 0.0609 0.4513 ...
$ Col8 : num 0.49 0.172 0.543 0.961 0.314 ...
$ Col9 : num 0.3511 0.159 0.3041 0.0175 0.9966 ...
$ Col10: num 0.0676 0.5614 0.0707 0.2114 0.5496 ...
$ Col12: num 0.715 0.123 0.311 0.946 0.5 ...
$ Col13: num 0.136 0.785 0.453 0.136 0.885 ...
$ Col14: num 0.4657 0.0499 0.1874 0.9827 0.3283 ...
$ Col15: num 0.867 0.732 0.315 0.386 0.332 ...
> mean( dtaList[[ "Dtaprefix2" ]]$Col2 )
[1] 0.4070087
On Wed, 25 Dec 2013, Levent TERLEMEZ wrote:
> Dear Users,
> I have a little problem with user-defined function. I would like to remove columns from a data frame using a user-defined function but i am getting a "Error in ad[, -12] : incorrect number of dimensions? error. The "ad<-ad[,-12]? and similar commands work from R console but i couldn?t make them run from my function. The function and the type imformation of one of my obtained data objects is below.
>
> Thanks in advance for your tips and helpful answers,
> Levent TERLEMEZ.
>
>
> Error:
> Error in ad[, -12] : incorrect number of dimensions
>
> My Function:
> function (dyolu,dadi,dsayi)
> {
> for(i in 1:dsayi)
> {
> ad<-paste(dadi,i,sep="")
> yol<-paste(dyolu,dadi,i,".csv",sep="")
> print(ad)
> print(yol)
> assign(eval(substitute(ad)), read.csv(yol,sep=";",dec=",",header=T), envir = globalenv())
> ad<-ad[,-12]????????????????????????> Here I would like to remove some columns but i even can?t remove one. I tried all the suggestion on internet forums.
> #dat[ , -which(names(dat) %in% c("z","u"))]
> }
> }
>
> dyolu: The string type variable containing the path of the csv files that will be read.
> dadi: The string type variable containing the name of csv files that will be read.
> dsayi: The numeri type variabe containing the number of files that will be read.
>
> My Data Object?s Attributes:
>> str(be1)
> 'data.frame': 74 obs. of 16 variables:
> $ Avi.TimeStamp: Factor w/ 74 levels " 0:00:40.00",..: 2 1 3 4 5 6 7 8 9 10 ...
> $ Frame : int 32949 32950 32952 32953 32954 32955 32957 32961 32962 32963 ...
> $ Spot.x : num 274 275 275 275 275 ...
> $ Spot.y : num 277 277 277 277 277 ...
> $ Pupil.x : num 240 242 242 241 241 ...
> $ Pupil.y : num 320 320 320 320 320 ...
> $ Pupil.r : num 47.7 47.5 47.6 47.8 47.7 ...
> $ Scene.x : num 46.2 30.3 34.6 30.4 43.1 ...
> $ Scene.y : num 102.5 71 71.9 73.7 92.2 ...
> $ Mouse.x : int 287 287 287 287 287 287 287 287 287 287 ...
> $ Mouse.y : int 570 570 570 570 570 570 570 570 570 570 ...
> $ X : logi NA NA NA NA NA NA ...
> $ H : int 0 0 0 0 0 0 0 0 0 0 ...
> $ M : int 0 0 0 0 0 0 0 0 0 0 ...
> $ S : int 40 40 41 41 41 41 41 41 41 41 ...
> $ Split : int 96 0 8 12 16 20 28 44 48 52 ?
>
> This data frame is obtained with the assign command from my function.
>
>
> [[alternative HTML version deleted]]
>
>
---------------------------------------------------------------------------
Jeff Newmiller The ..... ..... Go Live...
DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go...
Live: OO#.. Dead: OO#.. Playing
Research Engineer (Solar/Batteries O.O#. #.O#. with
/Software/Embedded Controllers) .OO#. .OO#. rocks...1k
More information about the R-help
mailing list