R_列名で列を削除する のバックアップの現在との差分(No.2) - アールメカブ

アールメカブ


R_列名で列を削除する のバックアップの現在との差分(No.2)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[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 <- 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] , ]
 }