Rに次の構造のテーブルがあります。
ID var1 var2 var3 .... varN
AA 1 2 1 3
AB 0.2 1 4 1
..。
var1<2
and var2<2
and var3<2
and ...の行のみを選択するにはどうすればよいですvarN<2
か?
あなたの例は再現できないので、私は自分自身を作りました:
x <- data.frame(x1 = 1:4, x2 = 2:5, x3 = 3:6, x4 = c(1,6,3,12))
#-----
x1 x2 x3 x4
1 1 2 3 1
2 2 3 4 6
3 3 4 5 3
4 4 5 6 12
あなたの基準に基づいて、行 2 と 4 を選択する必要があると思います。このコードはそれを取得します。
x[apply(x, 1, function(z) all(diff(z) > 0)),]
#-----
x1 x2 x3 x4
2 2 3 4 6
4 4 5 6 12
データフレームが行内dat
のすべての要素が 2 未満であり、それらの行のみを返すテストである場合、次のようになります。
dat[ apply( apply(dat[-1], 1, "<" ,2) , 2, all ), ]
ロジック: 内部適用は論理行列を返します。
apply(dat[-1], 1, "<" ,2)
[,1] [,2] [,3]
var1 TRUE TRUE TRUE
var2 TRUE FALSE TRUE
var3 TRUE TRUE FALSE
varN TRUE FALSE TRUE
R行列は列優先の順序で構築されるため、次元で転置されることに注意してください。そのため、外側の適用は列で機能する必要があるため、all
関数を適用するためのINDEXとして2を使用します。テスト:
dat <- read.table(text="ID var1 var2 var3 varN
BA 1 1 1 1
AA 1 2 1 3
AB 0.2 1 4 1", header=TRUE)
dat[ apply( apply(dat[-1], 1, "<" ,2) , 2, all ), ]
# ID var1 var2 var3 varN
#1 BA 1 1 1 1
データがdata.frame
DF にある場合:
DF[rowSums(DF) == sum(2 * dim(DF)[2]), ]
これはそれを行います:
dat[rowSums(dat[,-1] >= 2) == 0,]
テスト:
dat <- read.table(text=
"ID var1 var2 var3 varN
BA 1 1 1 1
AA 1 2 1 3
AB 0.2 1 4 1", header=TRUE)
dat[rowSums(dat[,-1] >= 2) == 0,]
# ID var1 var2 var3 varN
#1 BA 1 1 1 1
私があなたの質問を理解していれば、あなたが望むことを行うには少なくとも2つの方法があります(すでに指定されているものに加えて.1つ目はwhich()
コマンドです.クエリに基づいて:
datasetname[which((datasetname$var1<2) & (datasetname$var2<2) & ... ]
必要な行を返す必要があります。そうでしょう
newdatasetname <- subset(datasetname, datasetname$var1<2 & ...)
これらのコマンドの詳細については、R で ?subset
and と入力するだけです。?which