SQL или R: Найти и отобразить индекс всех '1 из столбца с двоичным типом данных и сохранить в другом 1 или более столбцов - PullRequest
0 голосов
/ 17 мая 2019

Я использую таблицу с именем «data_1», и один столбец «col_1» имеет двоичный тип данных (например, 1100000).

Я бы хотел получить позицию (индекс) всех '1 из этого столбца и сохранить их в другом 1 или более столбцах.

Вывод может быть:

1) «col_2» хранит значения 6 и 7, указывает на наличие «1» в индексах 6 и 7.

2) Или мы можем сохранить выходные данные в нескольких столбцах «pos_1», «pos_2», «pos_3», «pos_4», «pos_5», «pos_6», «pos_7» со значением (0, 0, 0, 0 , 0, 1, 1), что означает «1» в индексах 6 и 7, а остальные позиции «0».

Как мы можем реализовать в MySQL или в R?

Я пытался:

В R я пробовал следующую функцию, примененную к 'col_1', но она не работала.

    convert_to_binary <- function(n) {
      if(n > 1) {
        convert_to_binary(as.integer(n/2))
      }
      cat(n %% 2)
    }

    data_1$col_2 <- convert_to_binary(data_1$col_1)

В MySQL следующее возвращает только первый '1'

select POSITION(1 IN col_1) as col_2 from data_1;

Есть предложения здесь?

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Вот решение в MySQL, предполагающее, что числа имеют длину 7 символов. Вы можете добавить больше SUBSTRING выражений, если это возможно.

SELECT
col_1,
SUBSTRING(col_1, 1,1) AS pos_1,
SUBSTRING(col_1, 2,1) AS pos_2,
SUBSTRING(col_1, 3,1) AS pos_3,
SUBSTRING(col_1, 4,1) AS pos_4,
SUBSTRING(col_1, 5,1) AS pos_5,
SUBSTRING(col_1, 6,1) AS pos_6,
SUBSTRING(col_1, 7,1) AS pos_7
FROM data_1;

OR

SELECT
col_1,
CONCAT_WS(",", 
CASE WHEN SUBSTRING(col_1, 1,1)=1 THEN 1 END,
CASE WHEN SUBSTRING(col_1, 2,1)=1 THEN 2 END,
CASE WHEN SUBSTRING(col_1, 3,1)=1 THEN 3 END,
CASE WHEN SUBSTRING(col_1, 4,1)=1 THEN 4 END,
CASE WHEN SUBSTRING(col_1, 5,1)=1 THEN 5 END,
CASE WHEN SUBSTRING(col_1, 6,1)=1 THEN 6 END,
CASE WHEN SUBSTRING(col_1, 7,1)=1 THEN 7 END) AS col_2
FROM data_1;
1 голос
/ 17 мая 2019

Вот решение в R:

col_1<-c(1100000, 1100001, 1100100)

data_1 <- data.frame(col_1)

as.character(data_1$col_1) -> data_1$col_1

position<-function(x){unlist(gregexpr(pattern ='1',x))}

data_1$col_2 <- sapply(data_1$col_1, function(x) position(x))

as.character(data_1$col_2) -> data_1$col_2
gsub(":", ",", data_1$col_2) -> data_1$col_2
gsub("c", "", data_1$col_2) -> data_1$col_2

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...