2014-11-18 2 views
1

У меня есть кадр данных, и я хотел бы «выровнять» каждый столбец, чтобы максимальное значение для каждого столбца находилось в одной строке.R смещение вектора

Я пытался сделать это, используя базовую функциональность, но получаю неправильные результаты, т.е. просто переписывание и не перенос. Я только что нашел функцию Lag в Hmisc, однако, я уверен, что есть способ сделать это в базе, и я просто думаю об этом неправильно. Я бы предпочел это, поскольку, когда я пытаюсь запустить это позже на другом компьютере с другой verison из R всегда есть некоторый пакет, которые не поддерживаются

Спасибо за любую помощь,

maxIndices<-apply(df,2,function(x){ 
maxInt<-max(x,na.rm=T) 
maxInt_indx<-which(x==maxInt) 
}) 
maxMaxIndex<-max(maxIndices) 
minMaxIndex<-min(maxIndices) 
## 
apply(df,2,function(x){ 
    maxInt<-max(x,na.rm=T) 
    maxInt_indx<-which(x==maxInt) 
shift<-maxMaxIndex-maxInt_indx 
shifted_vec<-c(rep(NA,times=shift), x[1:length(x)+shift]) ## this is producing the wrong results 
# shifted_vec<-Lag(x,shift) # is there a way to do this using just base functionality 
}) 
+0

Должна быть одна строка, но чтобы убедиться, что ваш ответ верен, можете ли вы разместить некоторые данные и выходные данные? – John

+0

@beginneR Ваш код не работает таким образом; попробуй. – nograpes

+0

@ nograpes - вы правы. Еще раз я смутил 'dplyr :: lag' с' stats :: lag' –

ответ

1

Я думаю, что вы просто опечатка в одной строке:.

shifted_vec<-c(rep(NA,times=shift), x[1:(length(x)-shift)]) ## this is producing the wrong results 

Обратите внимание на (length(x)-shift). + должен быть -, и вокруг него должны быть скобки.


Хотя более лаконичным версия кода будет:

max.ind <- sapply(df, which.max) 
diff <- max(max.ind) - max.ind 
shift <- function (x, shift) c(rep(NA,times=shift), x[1:(length(x)-shift)]) 
mapply(shift, df, diff) 
+0

'base :: lag' возвращает объект временного ряда, который я не хочу здесь. – nograpes

5

Моя интерпретация того, что реализация функции сдвига может/должен выглядеть следующим образом:

#' function that shifts vector values to right or left 
#' 
#' @param x Vector for ehich to shift values 
#' @param n Number of places to be shifted. 
#' Positive numbers will shift to the right by default. 
#' Negative numbers will shift to the left by default. 
#' The direction can be inverted by the invert parameter. 
#' @param invert Whether or not the default shift directions 
#' should be inverted. 
#' @param default The value that should be inserted by default. 

shift <- function(x, n, invert=FALSE, default=NA){ 
    stopifnot(length(x)>=n) 
    if(n==0){ 
    return(x) 
    } 
    n <- ifelse(invert, n*(-1), n) 
    if(n<0){ 
    n <- abs(n) 
    forward=FALSE 
    }else{ 
    forward=TRUE 
    } 
    if(forward){ 
    return(c(rep(default, n), x[seq_len(length(x)-n)])) 
    } 
    if(!forward){ 
    return(c(x[seq_len(length(x)-n)+n], rep(default, n))) 
    } 
} 

Пример

shift(1:10, 5) 
## [1] NA NA NA NA NA 1 2 3 4 5 

shift(1:10, -5, default = 999) 
## [1] 6 7 8 9 10 999 999 999 999 999 
+0

Спасибо. Меня устраивает – andrii

Смежные вопросы