【发布时间】:2015-03-15 09:36:19
【问题描述】:
我试图在数据框中按列查找在遇到该列的最大值后满足特定条件的观察数。
这是一个高度简化的例子:
fake.dat<-data.frame(samp1=c(5,6,7,5,4,5,10,5,6,7), samp2=c(2,3,4,6,7,9,2,3,7,8), samp3=c(2,3,4,11,7,9,2,3,7,8),samp4=c(5,6,7,5,4,12,10,5,6,7))
samp1 samp2 samp3 samp4
1 5 2 2 5
2 6 3 3 6
3 7 4 4 7
4 5 6 11 5
5 4 7 7 4
6 5 9 9 12
7 10 2 2 10
8 5 3 3 5
9 6 7 7 6
10 7 8 8 7
因此,假设我在排除一列中的所有观察值(直到并包括该列出现最大值的行)之后,试图找出每列大于 5 的观察值。
预期结果:
samp1 samp2 samp3 samp4
2 2 4 3
我可以通过使用嵌套的for loops 排除我不想要的观察得到我想要的答案。
newfake.dat<-data.frame()
for(j in 1:length(fake.dat)){
for(i in 1:nrow(fake.dat)){
ifelse(i>max.row[j],newfake.dat[i,j]<-fake.dat[i,j],"NA")
print(newfake.dat)
}}
这会创建一个新的数据框,我可以在该数据框上运行一个简单的 apply 函数。
colcount<-apply(newfake.dat,2,function(x) (sum(x>5,na.rm=TRUE)))
V1 V2 V3 V4
1 NA NA NA NA
2 NA NA NA NA
3 NA NA NA NA
4 NA NA NA NA
5 NA NA 7 NA
6 NA NA 9 NA
7 NA 2 2 10
8 5 3 3 5
9 6 7 7 6
10 7 8 8 7
V1 V2 V3 V4
2 2 4 3
对于这个小型示例数据集来说,这一切都很好,但是对于任何接近我的真实数据集大小的东西来说,速度都非常慢。它们很大(2000 x 2000 或更大)且数量众多。我用我的一个文件的截断版本(更少的列,但相同的行数)尝试了它,它运行了至少 5 个小时(当我下班时我让它继续运行)。另外,除了能够运行应用函数之外,我真的不需要新的数据框。
有什么方法可以更有效地做到这一点?我尝试通过使用seq 和最大行数来限制apply 函数工作的行。
maxrow<-apply(fake.dat,2,function(x) which.max(x))
print(maxrow)
seq.att<-apply(fake.dat,2,function(x) {
sum(x[which(seq(1,nrow(fake.dat))==(maxrow)):nrow(fake.dat)]>5,na.rm=TRUE)})
这会引发此警告消息的四个实例:
1: In seq(1, nrow(fake.dat)) == (maxrow) :
longer object length is not a multiple of shorter object length
如果我忽略警告消息并获得输出,它不会给我预期的答案:
samp1 samp2 samp3 samp4
2 3 3 3
我还尝试使用while 函数,该函数一直在循环,所以我停止了它(我放错了为此尝试的代码)。
到目前为止,最有希望的结果来自嵌套的for loops,但我知道它的效率非常低,我希望有更好的方法。我还是 R 的新手,我确信我在某处遇到了一些语法。提前感谢您提供的任何帮助!
【问题讨论】:
标签: r for-loop conditional-statements apply