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)