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>

一部の列の保存

numericor integer(または特定のサブセット)のみを変換する場合は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 に答える