我真的是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 :(得分: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)