投稿

ラベル(which)が付いた投稿を表示しています

Rのデータフレームで、列名指定で列名の一部を変更する方法

まずは、動作確認用のサンプルコードです。 # サンプルコードのデータフレーム age    <- c( 20,  30,  40) height <- c(170, 168, 175) wait   <- c( 67,  64,  70) df <- data.frame(age, height, wait) df   age height wait 1  20    170   67 2  30    168   64 3  40    175   70 ちょ、待てよ。体重のweightがwaitになってんじゃん。 ってことで、この列名だけ変更したいと。 列名全体のベクトルをまとめて指定して変更する方法↓ names(df) <- c("age", "height", "weight") とか、 インデックス番号を使って、一部を変更する方法↓ names(df)[3] <- "weight" とかがあるんですが、列数がめちゃめちゃ多いデータだと数えるのが大変だし、列の削除や挿入に対してロバストでないし。できれば、列名の指定で変更を行いたい。 ちょっとコードがごちゃごちゃしますが、↓こんな感じでできます。 names(df)[ which( names(df)=="wait" ) ] <- "weight" 内側から順に見ていくと・・・ names(df)=="wait" で、列名が "wait" になっている位置が FALSE FALSE TRUE というベクトルで返ってきます。 それを which() に渡すと、「3」というインデックス番号が返ってきます。 なのでこの「3」を names(df)[] に対するインデックスの指定に使えばOKというわけです。

Rのduplicated関数を使ってデータフレームの重複チェック(改)

duplicated関数の引数にデータフレームを指定すると、すべての項目(列)を組み合わせた上での重複チェックができますよ、という話を以前書きました↓ Rのデータフレームで複数項目を組み合わせた重複のチェック - Rプログラミングの小ネタ また、上記の記事では、すべてではなく一部の項目のみを組み合わせ対象にしたい場合は、interaction関数を使って新たにチェック用の列を作ってはどう?、というやり方も紹介しました。 が、duplicated関数がすべての列を対象にする動きなら、対象にしたい列だけで構成された新たなデータフレームを生成して、duplicated関数に渡した方がシンプルではないか、ということに気づきました。 例えば↓こんなデータがあって、 > d    名字 名前 年齢 1  伊東 二郎   52 2  佐藤 五郎   52 3  遠藤 太郎   53 4  後藤 太郎   53 5  近藤 五郎   28 6  遠藤 二郎   33 7  後藤 四郎   52 8  須藤 次郎   28 9  伊東 二郎   35 10 遠藤 太郎   23 11 遠藤 史郎   38 12 工藤 吾郎   53 13 須藤 太郎   22 14 武藤 二郎   28 15 工藤 吾郎   53 16 伊東 二郎   22 17 遠藤 四郎   33 18 後藤 史郎   38 19 加藤 一郎   28 20 加藤 二郎   22 名字と名前だけを対象として重複チェックをしたい場合は、 > sum(duplicated( data.frame(d$名字, d$名前) )) [1] 4 とか、 > d[duplicated( data.frame(...

Rで比較対象がNAを含む場合の対処(データフレームの条件抽出あれこれ)

↓こんなデータフレームがあって、 > d name club 1 taro baseball 2 jiro football 3 hanako <NA> 4 ichiro baseball 5 yoshiko tennis clubがbaseballの行だけ抽出したい場合、↓こんなコードが最初に思い浮かびました。 d [ d$club == "baseball" , ] でも実は、これではうまくいかなくて、↓こんな結果になってしまいます。 > d [ d$club == "baseball" , ] name club 1 taro baseball NA <NA> <NA> 4 ichiro baseball "=="による比較の結果、TRUE/FALSEのベクトルが返ってきて、それでデータフレームを引くと、TRUEのところだけ残るという目論見なのですが、ベクトルにNAが混ざっており、その行はNAとして返ってきてしまうので都合が悪いです。 「NAではない」という条件を付け加えると、一応うまくいきます↓ > d [ ! is.na ( d$club ) & d$club == "baseball" , ] name club 1 taro baseball 4 ichiro baseball でもなんか、is.na関数とか使うのもなんだかなあと思っていたら、which関数が使えることに気づきました↓ > d [ which ( d$club== "baseball" ) , ] name club 1 taro baseball 4 ichiro baseball さらにいろいろ検索していると、いかにもそれ用な感じのsubset関数なるものがあることも知りました↓ > subset ( d , d$club== "baseball...