如何按R中的值选择行?

时间:2012-06-21 14:14:56

标签: r subset

我在R中有一个表格,结构如下:

ID var1 var2 var3 .... varN
AA  1    2    1          3
AB  0.2  1    4          1

...

如何仅选择var1<2var2<2以及var3<2和... varN<2的行?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果您的数据位于data.frame DF:

DF[rowSums(DF) == sum(2 * dim(DF)[2]), ]

答案 2 :(得分:1)

如果您的数据框为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矩阵是按列主要顺序构造的,因此外部apply适用于列,因此使用2作为INDEX来应用all函数。测试:

 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

答案 3 :(得分:0)

如果我理解你的问题,至少有两种方法可以做你想要的(除了那些已经指定的方法。第一种是which()命令。基于你的查询:

datasetname[which((datasetname$var1<2) & (datasetname$var2<2) & ... ]

应返回您想要的行。

newdatasetname <- subset(datasetname, datasetname$var1<2 & ...)

只需在R中输入?subset?which即可了解有关这些命令的更多信息。

答案 4 :(得分:0)

这样做:

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