Проверьте условия, используя значение определенного столбца и его предыдущего столбца за строкой в ​​R - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь создать вывод, в котором выполняется данное условие: - значение в данном столбце должно быть 1 - значение в предыдущем столбце должно быть -1

Например, входные данныебудет:

> cc <- matrix(c(1,-1,NA,-1,1,-1),  nrow=2, byrow = T)
> cc
     [,1] [,2] [,3]
[1,]    1   -1   NA
[2,]   -1    1   -1

Я хочу получить выходные данные с теми же размерами, что и мой ввод, и, в случае выполнения вышеуказанного условия, он вернет "ИСТИНА";В случае, если условие не выполняется, вывод должен возвращать FALSE или NA.Например:

> output<- matrix(c(NA,FALSE,NA,NA,TRUE,FALSE), nrow=2, byrow=T)
> output
     [,1]  [,2]  [,3]
[1,]   NA FALSE    NA
[2,]   NA  TRUE FALSE

В первом столбце есть NA, потому что у нас нет предыдущего столбца, но он также может быть FALSE.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Создание фрейма данных

cc <- data.frame(matrix(c(1,-1,NA,-1,1,-1),  nrow=2, byrow = T))

cc
   X1  X2  X3
1   1  -1  NA
2  -1   1  -1

Цикл по фрейму данных, изменение значения строки на основе значения из предыдущего столбца

# Loop starts from the last column
for(i in length(colnames(cc)):1){
    # Nested loop starts from first row
    for(j in 1:length(rownames(cc))){
        # Check if column is the first
        if(i == 1){
            cc[j,i] <- NA
        }
        # Check for NAs
        else if(is.na(cc[j,i]) | is.na(cc[j,i-1])){
            cc[j,i] <- NA
        }
        # Set to true if condition is met
        else if(cc[j,i] == 1 & cc[j,i-1] == -1){
            cc[j,i] <- TRUE
        } 
        # Else set to false
        else(cc[j,i] <- FALSE)
    }
}

Это, очевидно, может быть дополнительно оптимизировано, но я попыталсясделайте код как можно более простым.

Результат

cc
   X1  X2  X3
1  NA   0  NA
2  NA   1   0

Объяснение

Я думаю, что в вашем подходе может возникнуть логическая ошибка.Эта матрица не может быть зациклена в последовательном порядке (от столбца 1 до столбца n) и привести к разумному результату.Если вы начнете со столбца 1 и установите для него значение NA (поскольку у него нет предыдущего столбца), вы получите

     [,1] [,2] [,3]
[1,]   NA   -1   NA
[2,]   NA    1   -1

. В следующем цикле по столбцу 2 вы неизбежно получите все NAs какпредыдущий столбец - все NA (а не -1) и т. д.

     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA
0 голосов
/ 03 октября 2018

Вот способ получить желаемый результат:

> cbind(NA, cc[, -1, drop = F] == 1 & cc[, -ncol(cc), drop = F] == -1)
     [,1]  [,2]  [,3]
[1,]   NA FALSE    NA
[2,]   NA  TRUE FALSE

apply не требуется.drop = F используется для поддержания формы матрицы, если в ней только два столбца.

Другой способ:

> x <- seq_len(ncol(cc))
> cc[, c(NA, x[-1])] == 1 & cc[, c(NA, head(x, -1))] == -1
     [,1]  [,2]  [,3]
[1,]   NA FALSE    NA
[2,]   NA  TRUE FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...