1

我在 R 中有一个具有以下结构的表:

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

...

var1<2我怎样才能只选择and var2<2and var3<2and ...的那些行varN<2

4

5 回答 5

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
于 2012-06-21T14:24:21.110 回答
1

如果您的数据在data.frameDF 中:

DF[rowSums(DF) == sum(2 * dim(DF)[2]), ]
于 2012-06-21T14:17:38.557 回答
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 矩阵是按列优先顺序构造的,所以外部应用需要在列上工作,因此使用 2 作为应用all函数的 INDEX。测试:

 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
于 2012-06-21T14:30:57.027 回答
0

如果我理解您的问题,至少有两种方法可以做您想做的事情(除了已经指定的方法。第一种是which()命令。根据您的查询:

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

应该返回你想要的行。所以将

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

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

于 2012-06-21T16:50:06.187 回答
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
于 2016-05-04T06:41:42.543 回答