我确定这个问题的答案已经存在,但我无法找到,因为我是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
这有效,但我觉得必须有一个更简单的方法,或者函数可以用不同的方式编写?我仍然试图正确地解决整个功能问题。
当然,实际上我的数据框会有很多列。
/感恩的初学者
答案 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)