2012-06-20 64 views
2

我真的是一个R的初学者,所以,如果我的代码让你们感到震惊,对不起。 我的数据类似这样的事情:如何从最大值附近的数据框中选择列?

a b c d e f g h i j 
t1 0 0 0 0 3 0 0 0 0 0 
t2 0 0 0 0 0 6 0 0 0 0 
t3 0 0 0 0 0 0 0 0 0 8 
t4 0 0 0 0 0 0 0 0 9 0 

我想,每一行找到最大值列,然后拿到列减去一个3〜+ 3。 我写了下面的脚本来执行正是:

M<-c(1) 
for (row in 1: length(D[,1])) { 
    max<-which.max(D[row,]) 
    D<-D[,c(max-3,max-2,max-1,max,max+1,max+2,max+3)] 
    M<- cbind(M,D) 
} 
M<-M[,-1] 

它的工作,除了其中的最大值是在附近的一个行的开头或结尾一列的情况下(如行T3和T4在上面的例子)。在这种情况下,我想让7列更接近列的最大值,如下所示:

t1 0 0 0 3 0 0 0 
t2 0 0 0 6 0 0 0 
t3 0 0 0 0 0 0 8 
t4 0 0 0 0 0 9 0 

帮助将非常感谢!

dput()版本数据。例如:

structure(list(a = c(0L, 0L, 0L, 0L), b = c(0L, 0L, 0L, 0L), 
    c = c(0L, 0L, 0L, 0L), d = c(0L, 0L, 0L, 0L), e = c(3L, 0L, 
    0L, 0L), f = c(0L, 6L, 0L, 0L), g = c(0L, 0L, 0L, 0L), h = c(0L, 
    0L, 0L, 0L), i = c(0L, 0L, 0L, 9L), j = c(0L, 0L, 8L, 0L)), .Names = c("a", 
"b", "c", "d", "e", "f", "g", "h", "i", "j"), class = "data.frame", 
row.names = c("t1", "t2", "t3", "t4")) 
+0

这是一个适当的SO问题的教科书示例。感谢那! –

回答

2

这应该很好地工作:

t(apply(D, 
     MARGIN = 1, 
     FUN = function(X) { 
      n <- which.max(X) 
      i <- seq(min(max(1, n-3), ncol(D)-6), len=7) 
      X[i] 
     })) 
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
# t1 0 0 0 3 0 0 0 
# t2 0 0 0 6 0 0 0 
# t3 0 0 0 0 0 0 8 
# t4 0 0 0 0 0 9 0 

要测试键选择栏位可以作为你想它,你可以试试如下:

n <- 2 
seq(min(max(1, n-3), ncol(D)-6), len=7) 
n <- 10 
seq(min(max(1, n-3), ncol(D)-6), len=7) 
n <- 6 
seq(min(max(1, n-3), ncol(D)-6), len=7) 
+0

非常感谢这个答案,这正是我需要的! – afrendeiro

相关问题