首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一个整洁/简单的方法来实现这个data.table R代码?

有没有一个整洁/简单的方法来实现这个data.table R代码?
EN

Stack Overflow用户
提问于 2020-01-08 11:41:56
回答 3查看 491关注 0票数 2

来自经合组织数据的地层太长了,为了简单起见,我把这个名字放在下面的代码中,并希望将其简化为一个更简短、更精确的名称。

代码语言:javascript
复制
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包。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-08 12:12:34

当前的data.table开发版本有新的函数fcase (模仿SQL CASE WHEN)来应对这种情况:

代码语言:javascript
复制
pisaMas[ , SchoolType := fcase(
  STRATUM == "National Secondary School", "Public", 
  STRATUM == "Religious School", "Religious", 
  STRATUM == "MOE Technical School", "Technical",
  default = ''
)]
pisaMas[ , table(SchoolType)]

要获取开发版本,请尝试

代码语言:javascript
复制
install.packages(
  'data.table', type = 'source',repos = 'http://Rdatatable.github.io/data.table'
)

如果简单安装不起作用,您可以查看安装维基获取更多详细信息:

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

你也可以用一个查询表来解决这个问题,详情请看下面的问答:

https://stackoverflow.com/a/36391018/3576984

票数 4
EN

Stack Overflow用户

发布于 2020-01-08 12:11:32

这是我经过几次思考后得出的结论。

代码语言:javascript
复制
#' 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中传递它,通过在data.table中应用base R (sapply),因此设法避免了代码混乱,看起来更简单:

代码语言:javascript
复制
pisaMalaysia[,`:=`(jenisSekolah = sapply(STRATUM,rname.SchType))]
票数 0
EN

Stack Overflow用户

发布于 2020-01-20 16:14:30

我想我终于找到了上面问题的答案!这个答案克服了@Roland提到的“未矢量化”的问题,谢谢先生!在我看来,这要快得多,尽管我花了几个星期的时间来理解这个概念,并在网上找到正确的问题!

首先,我创建了一个包含2列的新data.table,一列具有原始名称,另一列是学校所需的名称。

代码语言:javascript
复制
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 to data.table )。

使用这行代码我读到了here,它看起来有点长,但它解决了我的问题!老实说,在我理解下面最短的代码之前,我首先理解了这一点。

代码语言:javascript
复制
setDT(pisaMalaysia)[,SCH.TYPE := lookUpStratum$SCH.TYPE[match(pisaMalaysia$STRATUM,lookUpStratum$STRATUM)]]

几分钟后,我终于想通了这段代码here,并生成了以下代码:

代码语言:javascript
复制
setDT(pisaMalaysia)[lookUpStratum,SCH.TYPE1 := i.SCH.TYPE, on = c(STRATUM = "STRATUM")]

我从同一篇文章here中得到了这些答案。

要检查所有内容是否相同,请执行以下操作:

代码语言:javascript
复制
table(pisaMalaysia$SCH.TYPE)
table(pisaMalaysia$SCH.TYPE1)
#' original data
pisaMalaysia[,table(STRATUM)]

结果:

代码语言:javascript
复制
> 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59639119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档