Попытка поместить if condion в r и создание новой переменной с определенным условием для двух переменных - PullRequest
0 голосов
/ 26 января 2020
Group A      Group B
custid       sd,custid,region-101%41,townsize
region       region
townsize     townsize
gender       gender,(part2)
age          agecat,birthmonth,gendor
agecat       birthmonth
birthmonth   edcat

SQL:

Select *,
       case when (GroupA=GROUPB) "OK"
            WHEN INSTR(GROUPA,GROUPB,1,1)>0 
                 and INSTR(GROUPA,GROUPB,',',1,1)>0"Ok but different groups"
       ELSE Review group "review);

Приведенный выше код работает нормально при попытке импортировать данные из базы данных oracle.

Я хочу использовать то же условие при r после создания набора данных на языке r, но он не работает, я пробовал пакет sqldf, но он все еще не работает

Group A      Group B
custid       sd,custid,region-101%41,townsize
region       region
townsize     townsize
gender       gender,(part2)
age          agecat,birthmonth,gendor
agecat       birthmonth
birthmonth   edcat

enter image description here

Если вы могли бы помочь написать это запрос в R или sql.

1 Ответ

1 голос
/ 26 января 2020

Исходя из комментариев к вопросу, я предполагаю, что вы хотите использовать sqldf со стандартным SQLite для этого. В этом случае это исправляет ошибки в select. Мы предполагаем данные в примечании в конце (показаны воспроизводимым образом).

library(sqldf)

sqldf("select *,
         case when GroupA = GroupB then 'OK'
              when instr(',' || GroupB || ',', ',' || GroupA || ',')
                 then 'OK but different groups'
              else 'review'
         end status
       from DF")

, что дает:

      GroupA                           GroupB                  status
1     custid sd,custid,region-101%41,townsize OK but different groups
2     region                           region                      OK
3   townsize                         townsize                      OK
4     gender                   gender,(part2) OK but different groups
5        age         agecat,birthmonth,gendor                  review
6     agecat                       birthmonth                  review
7 birthmonth                            edcat                  review

Это можно сделать альтернативно с помощью функции case_when в пакет dplyr:

library(dplyr)
DF %>%
  mutate(status = case_when(
    GroupA == GroupB ~ "OK",
    mapply(grepl, paste0(',', GroupA, ','), paste0(',', GroupB, ',')) ~ 
      "OK but different groups",
    TRUE ~ 'review'
  ))

Примечание

Входные данные в воспроизводимом виде:

Lines <- 'GroupA      GroupB
custid       sd,custid,region-101%41,townsize
region       region
townsize     townsize
gender       gender,(part2)
age          agecat,birthmonth,gendor
agecat       birthmonth
birthmonth   edcat'
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)
...