R_列名で列を削除する - アールメカブ

アールメカブ


R_列名で列を削除する

Rの備忘録

例えば,あるデータフレームから,複数の列を取り出すのであれば.

dat <- dat[, c("X","Y")]

とすれば良い.

が,取り除きたい場合,その列番号を指定する方法と,列名を指定する方法があるのだが,列一個なら次のようにできる

dat <- dat[, colnames(dat) != "X"]

複数の場合は

dat <- dat[, -which (colnames(dat) %in% c("X", "Y", "Z"))]

あるいは

dat <- dat[, !(colnames(dat) %in% c("X", "Y", "Z"))]

こんな感じだろう.行の場合は

dat <- dat[!(rownames(dat) %in% c("X", "Y", "Z")), ]

以下,ずいぶん前のメモ書き,恥ずかしながらさらしておく

ところが,複数の場合,問題がある?

dat <-  read.csv("category.csv", skip = 3, header=T)
dat[1,]
colnames(dat)

ここで列名が Q1A1などの形式になっているとして,

Q <- c(1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, 9, 10, 10, 11, 13, 13, 14, 15)  
A <- c(2, 2, 2, 4, 2, 4, 1, 1, 1, 1, 1, 3,  1,  3,  2,  1,  2,  1,  1)

列名を表す文字ベクトルを作成し

QA <- paste("Q", Q, "A", A, sep = "")

気持ちとしては

dat <- dat[ , colnames(dat) != QA]

あるいは

dat[ , which(colnames(dat) != QA]
dat[ , -which(colnames(dat) == QA]

で結果を得たいのだが,そうはいかない模様.これはベクトルの先頭から,対応する位置にある要素を比較するが,QAの方の長さがcolnames(dat) に比べて短いため,リサイクルされるので,意図する検索結果が得られないため.

for(i in 1:length(QA)){
 dat <- dat[ , colnames(dat) != QA[i]]
}
colnames(dat)

と,ループしないといけない?何か間違っているか?

特定の行を除きたい場合も同様

for(i in 1:length(Textname)){
 dat <- dat[dat$text  != Textname[i] , ]
}
 
Link: R_old_tips2(1943d) Rの備忘録(3980d) 日録2008年_2月(5739d)
Last-modified: 2009-11-20 (金) 14:41:49 (5469d)