来自经合组织数据的地层太长了,为了简单起见,我把这个名字放在下面的代码中,并希望将其简化为一个更简短、更精确的名称。
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包。
发布于 2020-01-08 12:12:34
当前的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
你也可以用一个查询表来解决这个问题,详情请看下面的问答:
发布于 2020-01-08 12:11:32
这是我经过几次思考后得出的结论。
#' 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),因此设法避免了代码混乱,看起来更简单:
pisaMalaysia[,`:=`(jenisSekolah = sapply(STRATUM,rname.SchType))]发布于 2020-01-20 16:14:30
我想我终于找到了上面问题的答案!这个答案克服了@Roland提到的“未矢量化”的问题,谢谢先生!在我看来,这要快得多,尽管我花了几个星期的时间来理解这个概念,并在网上找到正确的问题!
首先,我创建了一个包含2列的新data.table,一列具有原始名称,另一列是学校所需的名称。
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,它看起来有点长,但它解决了我的问题!老实说,在我理解下面最短的代码之前,我首先理解了这一点。
setDT(pisaMalaysia)[,SCH.TYPE := lookUpStratum$SCH.TYPE[match(pisaMalaysia$STRATUM,lookUpStratum$STRATUM)]]几分钟后,我终于想通了这段代码here,并生成了以下代码:
setDT(pisaMalaysia)[lookUpStratum,SCH.TYPE1 := i.SCH.TYPE, on = c(STRATUM = "STRATUM")]我从同一篇文章here中得到了这些答案。
要检查所有内容是否相同,请执行以下操作:
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 谢谢!希望这也能帮助到其他人。
https://stackoverflow.com/questions/59639119
复制相似问题