8

単一の列の値に基づいて data.frame を「切り捨てる」にはどうすればよいですか? たとえば、このマトリックスがある場合

x <- c(5,1,3,2,4)
y <- c(1,5,3,4,2)
data <- data.frame(x,y)

x以上の値のすべてのデータが必要ですが、どうすればよいですか? を使用して x 値のアドレスを見つけることができることを知っています

addresses <- which(x>=2)

しかし、これを使用して新しいマトリックスを作成する方法がわかりません。以下は機能しません。

data2 <- data[x>=2]
data2 <- data[which(x>=2)]

誰かがアドバイスを提供できる場合は、本当に感謝します。

4

2 に答える 2

17

エラーメッセージを十分に読んでいません。ここで、エラーメッセージは、列を選択していないことを示しています。ただし、行の条件を指定しました。

> data[which(x>=2)]
Error in `[.data.frame`(data, which(x >= 2)) : undefined columns selected

すべての列を返したいので、(すべての列を返すことを示す)コンマを入れるだけで、すべて設定されているはずです。

> data[which(x>=2), ] # if x is in your workspace
  x y
1 5 1
3 3 3
4 2 4
5 4 2
> ## with(data, data[x >= 2, ] # if x is not in your workspace

data.frame注意すべきもう1つのポイントは次のとおりです。次のように直接作成できます。

data <- data.frame(x = c(5,1,3,2,4), y = c(1,5,3,4,2))

これが私がこれを提案する理由です。まず、ワークスペースに不要なオブジェクトはありません。第二に、あなたは何かが機能していないのに機能していると考えることに騙されません。あなたは次のように書いています:「私はx値のアドレスを使用して見つけることができることを知っていますaddresses <- which(x>=2)」。本当ですが、おそらく気づかなかったのは(したがって、この質問)、実際にはdata.frameワークスペースの「x」ベクトルではなく「x」にアクセスしているということです。

于 2013-03-04T16:57:30.577 に答える
9

まず、dataは行列ではなく、データ フレームです。そして、あなたがやろうとしているのは、データフレームを行ごとにインデックス付けすることです。[これは、演算子の最初の部分で条件を指定することによって実行できます。このようなもの :

data2 <- data[data$x>=2,]

コンマと閉じ括弧の間には何もないことに注意してください。これは列のインデックス付けの場所だからです。ここでは、「すべての列を選択する」という意味はありません。

于 2013-03-04T16:57:40.000 に答える