R过滤数据帧以满足符合条件的列的比例

时间:2014-08-18 08:38:18

标签: r

我确定这个问题的答案已经存在,但我无法找到,因为我是R的初学者并且不知道要使用哪些搜索字词。

我想检索数据框中的行,其中给定比例的列符合条件。例如,2/3列> 1.3。

这是我到目前为止所做的:

a<-c(1.1,1.2,1.3,1.4,1.5)
b<-c(1.3,1.4,1.5,1.6,1.7)
c<-c(1.5,1.6,1.7,1.8,1.9)
data<-data.frame(a,b,c)
data`

   a   b   c
1 1.1 1.3 1.5
2 1.2 1.4 1.6
3 1.3 1.5 1.7
4 1.4 1.6 1.8
5 1.5 1.7 1.9


c<-function(x) (length(x[(x>1.4)]))>=(2/3*ncol(data))
d<-apply(data,1,c)
result<-data[d,]
result

   a   b   c
3 1.3 1.5 1.7
4 1.4 1.6 1.8
5 1.5 1.7 1.9

这有效,但我觉得必须有一个更简单的方法,或者函数可以用不同的方式编写?我仍然试图正确地解决整个功能问题。

当然,实际上我的数据框会有很多列。

/感恩的初学者

2 个答案:

答案 0 :(得分:1)

可能(因为rowSums被矢量化应该更高效,并且无需使用apply循环)

data[rowSums(data > 1.4) >= 2/3*ncol(data),]

##     a   b   c
## 3 1.3 1.5 1.7
## 4 1.4 1.6 1.8
## 5 1.5 1.7 1.9

或者如果您更喜欢某个功能,可以尝试

myfunc <- function(x) x[rowSums(x > 1.4) >= 2/3*ncol(x), ]
myfunc(data)

##     a   b   c
## 3 1.3 1.5 1.7
## 4 1.4 1.6 1.8
## 5 1.5 1.7 1.9

答案 1 :(得分:0)

只是为大卫的答案提供另一种选择。您可以在R中的逻辑值向量上使用mean函数来返回向量中TRUE值的百分比。

创建数据

a<-c(1.1, 1.2, 1.3, 1.4, 1.5)
b<-c(1.3, 1.4, 1.5, 1.6, 1.7)
c<-c(1.5, 1.6, 1.7, 1.8, 1.9)
data<-data.frame(a, b, c)

返回逻辑向量的函数,指示值是否高于阈值

gt <- function(x, threshold){
  tmp <- x > threshold
  return(tmp)
}

使用data.frame

第一行的示例
gt(data[1,], 1.4)

如果取逻辑向量的总和,则返回TRUE个实例的数量:

sum(gt(data[1,], 1.4))
# [1] 1

如果您使用mean函数,则返回正实例的百分比:

mean(gt(data[1,], 1.4))
# [1] 0.3333333

使用它可以使用David的方法:

index <- apply(data,1, function(x) sum(gt(x, 1.4)) >= 2/3 * length(x))

或者您可以通过mean功能使用百分比。

index <- apply(data,1, function(x) mean(gt(x, 1.4)) > 0.6)