r - 如何从数据框中选择具有最大值的列?

标签 r dataframe

我确实是 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"))

最佳答案

这应该可以很好地工作:

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)

关于r - 如何从数据框中选择具有最大值的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122135/

相关文章:

python - 将列的数据转换为枚举字典键值

R降雪并行,Rscript.exe随着时间的推移逐渐变得不活跃

r - 使用 melt 将数据合并到一个长列中

r - data.frame 中按组求和

r - RTextTools 中的德语词干分析器

r - 将多列添加到 R 中的 data.table

python - 如何过滤数据框以便在特定时间每天发生一次

function - 自定义函数中存储的值

r - 使用 purrr 和 map (tidyverse) 迭代因变量

python - Pandas 数据框使用列作为行