Initializing an empty data.frame file with the same column and row names as existing data.frame

Is there a better way to make an empty data.frame with the same dimensions, column names and row names as an existing data.frame?

BAM<-read.table(~/myfile) # 10 rows and 10 columns, full of data print(BAM) SNP AZ04 AZ05 AZ06 AZ07 AZ08 AZ09 AZ10 AZ11 AZ12 1 0512930_3028 1 15 3 3 2 0 2 9 4 2 0512933_33862 0 7 1 5 18 2 4 10 5 3 0512933_33866 0 7 1 5 18 2 4 10 5 4 0512933_49263 4 12 15 14 14 9 7 15 15 5 0512933_315059 2 3 6 6 18 3 11 3 14 6 0512933_319854 4 3 10 6 8 2 6 12 8 7 0512933_330379 0 12 5 0 16 1 8 10 7 8 0512933_359868 9 9 7 9 18 9 16 14 11 9 0512933_390380 8 18 19 10 26 10 12 17 18 10 0512933_405563 2 10 13 10 17 14 10 13 14 Initial.matrix<-matrix(nrow=nrow(BAM), ncol=ncol(BAM), dimnames=list(1:(ncol(BAM)), (colnames(BAM)))) Blank.data.frame<-data.frame(Initial.matrix) Blank.data.frame$SNP=BAM$SNP print(Blank.data.frame) SNP AZ04 AZ05 AZ06 AZ07 AZ08 AZ09 AZ10 AZ11 AZ12 1 0512930_3028 NA NA NA NA NA NA NA NA NA 2 0512933_33862 NA NA NA NA NA NA NA NA NA 3 0512933_33866 NA NA NA NA NA NA NA NA NA 4 0512933_49263 NA NA NA NA NA NA NA NA NA 5 0512933_315059 NA NA NA NA NA NA NA NA NA 6 0512933_319854 NA NA NA NA NA NA NA NA NA 7 0512933_330379 NA NA NA NA NA NA NA NA NA 8 0512933_359868 NA NA NA NA NA NA NA NA NA 9 0512933_390380 NA NA NA NA NA NA NA NA NA 10 0512933_405563 NA NA NA NA NA NA NA NA NA 

My code above gives me what I want. Is there a cleaner or easier way to do this?

Thanks Anna (new to R)

+4
source share
2 answers

Just create a copy of BAM and multiply all numeric elements by NA .

 Blank.data.frame <- BAM Blank.data.frame[,-1] <- Blank.data.frame[,-1] * NA 

Or more generally:

 Blank.data.frame <- BAM numCols <- sapply(Blank.data.frame, is.numeric) Blank.data.frame[,numCols] <- Blank.data.frame[,numCols] * NA 
+5
source

Using the `is.na<-` in the lapply will work and preserve the types and sizes of columns and factors. Use do.call(data.frame,...) to recreate data.frame

 do.call(data.frame, lapply(BAM, `is.na<-`) 

for instance

 BAM <- data.frame(x=1:5, y =rnorm(5), z = factor(letters[1:5])) blank_bam <- do.call(data.frame,lapply(BAM, `is.na<-`)) str(blank_bam) ## 'data.frame': 5 obs. of 3 variables: ## $ x: int NA NA NA NA NA ## $ y: num NA NA NA NA NA ## $ z: Factor w/ 5 levels "a","b","c","d",..: NA NA NA NA NA blank_bam ## xyz ## 1 NA NA <NA> ## 2 NA NA <NA> ## 3 NA NA <NA> ## 4 NA NA <NA> ## 5 NA NA <NA> 

Saving some columns

If you only want to convert a numeric or integer (or any particular subset), run lapply on that subset of columns

For example, saving columns of factors.

I will filter to select only non-factor columns using Filter and is.factor

 # convert the non factor columns num_blank <- lapply(Filter(Negate(is.factor), BAM), `is.na<-`) #subset the original columns factor_original <- filter(is.factor, BAM) # combine and return in original column order bam_blank <- do.call(data.frame, c(factor_original, num_blank))[,names(BAM)] bam_blank ## xyz ## 1 NA NA a ## 2 NA NA b ## 3 NA NA c ## 4 NA NA d ## 5 NA NA e str(bam_blank) ## 'data.frame': 5 obs. of 3 variables: ## $ x: int NA NA NA NA NA ## $ y: num NA NA NA NA NA ## $ z: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5 
+1
source

Source: https://habr.com/ru/post/1434859/


All Articles