我在R中有一个表格,结构如下:
ID var1 var2 var3 .... varN
AA 1 2 1 3
AB 0.2 1 4 1
...
如何仅选择var1<2
和var2<2
以及var3<2
和... varN<2
的行?
答案 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