Есть ли аккуратный / самый простой способ для этого data.table R код? - PullRequest
2 голосов
/ 08 января 2020

STRATUM из данных ОЭСР является настолько длинным, для простоты я назвал это имя и хотел бы упростить его до более короткого и точного наименования, как показано в коде ниже.

pisaMas[,`:=`
             (SchoolType = c(ifelse(STRATUM == "National Secondary School", "Public", 
                                    ifelse(STRATUM == "Religious School", "Religious", 
                                           ifelse(STRATUM == "MOE Technical School", "Technical",0)))))]
pisaMas[,table(SchoolType)]

Я хотел бы узнать, есть ли простой способ решения этой проблемы, используя пакет data.table.

Ответы [ 3 ]

4 голосов
/ 08 января 2020

Текущая версия разработки data.table имеет новую функцию fcase (смоделированную после SQL CASE WHEN) для этой ситуации:

pisaMas[ , SchoolType := fcase(
  STRATUM == "National Secondary School", "Public", 
  STRATUM == "Religious School", "Religious", 
  STRATUM == "MOE Technical School", "Technical",
  default = ''
)]
pisaMas[ , table(SchoolType)]

Чтобы получить версию разработки, попробуйте

install.packages(
  'data.table', type = 'source',repos = 'http://Rdatatable.github.io/data.table'
)

Если простая установка не работает, вы можете проверить вики установки для более подробной информации:

https://github.com/Rdatatable/data.table/wiki/Installation

Вы также можете решить это с таблицей поиска, см. этот Q & A для деталей:

{ ссылка }

0 голосов
/ 20 января 2020

Мне кажется, я наконец получил ответ на свой вопрос выше! Этот ответ преодолевает проблему «не векторизации», как упомянуто @Roland, спасибо, сэр! И это, на мой взгляд, намного быстрее, хотя мне потребовалось буквально пару недель, чтобы понять концепцию и найти правильные вопросы в Интернете!

Во-первых, я создаю новую таблицу данных, состоящую из 2 столбцы, один с оригинальным именем, а второй - имя школы.

lookUpStratum <- data.table(STRATUM=c("MYS - stratum 01: MOE National Secondary School\\Other States",
                                      "MYS - stratum 02: MOE Religious School\\Other States",
                                      "MYS - stratum 03: MOE Technical School\\Other States",
                                      "MYS - stratum 04: MOE Fully Residential School",
                                      "MYS - stratum 05: non-MOE MARA Junior Science College\\Other States",
                                      "MYS - stratum 06: non-MOE Other Schools\\Other States",
                                      "MYS - stratum 07: Perlis non-“MOE Fully Residential Schools”",
                                      "MYS - stratum 08: Wilayah Persekutuan Putrajaya non-“MOE Fully Residential Schools”",
                                      "MYS - stratum 09: Wilayah Persekutuan Labuan non-“MOE Fully Residential Schools”"),
                            SCH.TYPE=c("Public",
                                       "Religious",
                                       "Technical",
                                       "SBP",
                                       "MARA",
                                       "Private",
                                       "Perlis Fully Residential",
                                       "Putrajaya Fully Residential",
                                       "Labuan Fully Residential"))

Ответ лежит на setDT (Привести списки и data.frames к data.table по ссылке).

Используя эту строку кода, которую я прочитал здесь , это выглядит довольно долго, но это решило мою проблему! И, честно говоря, я сначала понимаю это, прежде чем понимаю самый короткий код ниже.

setDT(pisaMalaysia)[,SCH.TYPE := lookUpStratum$SCH.TYPE[match(pisaMalaysia$STRATUM,lookUpStratum$STRATUM)]]

Через несколько минут мне наконец-то удалось разобраться с этим кодом здесь и произвел это код:

setDT(pisaMalaysia)[lookUpStratum,SCH.TYPE1 := i.SCH.TYPE, on = c(STRATUM = "STRATUM")]

Я получил эти ответы из того же поста здесь .

Чтобы проверить, все ли одинаково:

table(pisaMalaysia$SCH.TYPE)
table(pisaMalaysia$SCH.TYPE1)
#' original data
pisaMalaysia[,table(STRATUM)]

Результаты:

> table(pisaMalaysia$SCH.TYPE)
   Labuan Fully Residential                        MARA    Perlis Fully Residential 
                         54                         122                          78 
                    Private                      Public Putrajaya Fully Residential 
                        385                        4929                          78 
                  Religious                         SBP                   Technical 
                        273                        2661                         281 

> table(pisaMalaysia$SCH.TYPE1)
   Labuan Fully Residential                        MARA    Perlis Fully Residential 
                         54                         122                          78 
                    Private                      Public Putrajaya Fully Residential 
                        385                        4929                          78 
                  Religious                         SBP                   Technical 
                        273                        2661                         281 

> pisaMalaysia[,table(STRATUM)]
STRATUM
                      MYS - stratum 01: MOE National Secondary School\\Other States 
                                                                               4929 
                               MYS - stratum 02: MOE Religious School\\Other States 
                                                                                273 
                               MYS - stratum 03: MOE Technical School\\Other States 
                                                                                281 
                                     MYS - stratum 04: MOE Fully Residential School 
                                                                               2661 
                MYS - stratum 05: non-MOE MARA Junior Science College\\Other States 
                                                                                122 
                              MYS - stratum 06: non-MOE Other Schools\\Other States 
                                                                                385 
                       MYS - stratum 07: Perlis non-“MOE Fully Residential Schools” 
                                                                                 78 
MYS - stratum 08: Wilayah Persekutuan Putrajaya non-“MOE Fully Residential Schools” 
                                                                                 78 
   MYS - stratum 09: Wilayah Persekutuan Labuan non-“MOE Fully Residential Schools” 
                                                                                 54 

Спасибо! Надеюсь, это поможет и другим.

0 голосов
/ 08 января 2020

Это то, с чем я выступаю после нескольких мыслей.

#' First I create a function (rname.SchType) that have oldname and newname using else if:

rname.SchType <- function(x){
  if (is.na(x)) NA
  else if (x == "MYS - stratum 01: MOE National Secondary School\\Other States")"Public"
  else if(x == "MYS - stratum 02: MOE Religious School\\Other States")"Religious" 
  else if(x == "MYS - stratum 03: MOE Technical School\\Other States")"Technical"
  else if(x == "MYS - stratum 04: MOE Fully Residential School")"SBP"
  else if(x == "MYS - stratum 05: non-MOE MARA Junior Science College\\Other States")"MARA"
  else if(x == "MYS - stratum 06: non-MOE Other Schools\\Other States")"Private"
  else if(x == "MYS - stratum 07: Perlis non-“MOE Fully Residential Schools”")"Perlis Fully Residential"
  else if(x == "MYS - stratum 08: Wilayah Persekutuan Putrajaya non-“MOE Fully Residential Schools”")"Putrajaya Fully Residential"
  else if(x == "MYS - stratum 09: Wilayah Persekutuan Labuan non-“MOE Fully Residential Schools”")"Labuan Fully Residential"
}

Используя только что созданную функцию, я пропускаю ее через data.table с помощью всего лишь строки кода, применяя base R (sapply) внутри data.table, следовательно, удалось избежать беспорядка кода и выглядеть намного проще:

pisaMalaysia[,`:=`(jenisSekolah = sapply(STRATUM,rname.SchType))]
...