4

有没有更好的方法来制作与现有 data.frame 具有相同维度、列名和行名的空白 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

我上面的代码得到了我想要的。有更清洁或更简单的方法吗?

谢谢,安娜(R初学者)

4

2 回答 2

5

只需创建一个副本BAM并将所有数字元素乘以NA.

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

或者,更一般地说:

Blank.data.frame <- BAM
numCols <- sapply(Blank.data.frame, is.numeric)
Blank.data.frame[,numCols] <- Blank.data.frame[,numCols] * NA
于 2012-09-18T14:21:44.000 回答
1

`is.na<-`在语句中使用该函数lapply将起作用并保留列类型和因子级别和维度。用于do.call(data.frame,...)重新创建 data.frame

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

例如

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
##    x  y    z
## 1 NA NA <NA>
## 2 NA NA <NA>
## 3 NA NA <NA>
## 4 NA NA <NA>
## 5 NA NA <NA>

保留一些列

如果您只想转换numericinteger(或任何特定子集),则lapply在该列子集上运行

例如,保留因子列。

Filter我将使用和过滤以仅选择非因子列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
##    x  y z
## 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
于 2012-09-18T23:11:38.650 回答