[[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] , ] }