回答:
my.data.frame <- subset(data , V1 > 2 | V2 < 4)
この関数の動作を模倣し、関数本体に含めるのにより適切な代替ソリューション:
new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]
一部の人々は、which
不要な使用を批判しますが、NA
値が不要な結果を返すのを防ぎます。上記の2つのオプションと同等のもの(つまり、V1またはV2のNAのNA行を返さない)は、次のようにwhich
なります。
new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4) , ]
注:上記のコードのエラーを修正しようとした匿名の寄稿者、モデレーターによって拒否された修正に感謝します。最初のエラーを修正しているときに気づいた追加のエラーが実際にありました。NA値をチェックする条件句は、意図したとおりに処理する必要がある場合、最初にする必要があります...
> NA & 1
[1] NA
> 0 & NA
[1] FALSE
「&」を使用する場合、引数の順序が重要になることがあります。
[
は、ラップインするwhich
か、追加の!is.na
制約を使用する必要があります。
which
。V1とV2の両方がNAの場合、省略した場合、その位置にNAの行が表示されますwhich
。私は大規模なデータセットを操作しますが、NAの比較的小さなパーセンテージでさえも、画面をジャンク出力でいっぱいにしてしまいます。これは機能だと考える人もいます。私はしません。
grepl
またはgrep
これを含める方法を教えてください。
「|」を探しています。http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectorsを参照してください
my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]
NA
データフレームでS:vc <- data.frame(duzey=factor(c("Y","O","Y","D","Y","Y","O"), levels=c("D","O","Y"), ordered=TRUE), cinsiyet=c("E","E","K",NA,"K","E","K"), yas=c(8,3,9,NA,7,NA,6), Not=c(NA,1,1,NA,NA,2,1)); vc; vc[vc$cinsiyet == "E" | vc$Not < 4,]; vc[vc$cinsiyet == "E" & vc$Not < 2,]
完全を期すために、演算子[
と[[
:
set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])
いくつかのオプション
df[df[1] < 0.5 | df[2] == "g", ]
df[df[[1]] < 0.5 | df[[2]] == "g", ]
df[df["v1"] < 0.5 | df["v2"] == "g", ]
df $ nameはdf [["name"、exact = FALSE]] と同等です。
使用dplyr
:
library(dplyr)
filter(df, v1 < 0.5 | v2 == "g")
使用sqldf
:
library(sqldf)
sqldf('SELECT *
FROM df
WHERE v1 < 0.5 OR v2 = "g"')
上記のオプションの出力:
v1 v2
1 0.26550866 a
2 0.37212390 b
3 0.20168193 e
4 0.94467527 g
5 0.06178627 j
sqldf
パッケージには、あまりにも良いです。特にsubset()
少し痛いときに非常に便利です:)