R 根据data.table中的逻辑字符串匹配,将值分配给新列
我有一个很大的学生数据集,其中有非标准的优等生命名约定。我需要创建/填充一个新列,该列将返回Y或N,用于基于单词“荣誉”的字符串匹配 这是我目前的数据,有超过200000名学生R 根据data.table中的逻辑字符串匹配,将值分配给新列,r,string,data.table,multiple-columns,R,String,Data.table,Multiple Columns,我有一个很大的学生数据集,其中有非标准的优等生命名约定。我需要创建/填充一个新列,该列将返回Y或N,用于基于单词“荣誉”的字符串匹配 这是我目前的数据,有超过200000名学生 library(data.table) students<-data.table(Student_ID = c(10001:10005), Degree= c("Bachelor of Laws", "Honours Degree in Commerce", "Bachel
library(data.table)
students<-data.table(Student_ID = c(10001:10005),
Degree= c("Bachelor of Laws", "Honours Degree in Commerce", "Bachelor of Laws (with Honours)", "Bachelor of Nursing with Honours", "Bachelor of Nursing"))
其实很简单
students[, Honours := c("N", "Y")[grepl("Honours", Degree, fixed = TRUE) + 1L]]
您所需要做的就是使用一些正则表达式实现函数(例如grepl
)搜索“荣誉”(这不是一个真正的表达式,因此您可以使用fixed=TREU
)提高性能),然后根据您的发现从c(“N”,“Y”)
执行向量子集设置(aTRUE
/FALSE
逻辑向量+1L,将其转换为1,2
向量,用于从c(“N”,“Y”)
中减去值)
或者,如果这太难阅读,您可以使用
ifelse
students[, Honours := ifelse(grepl("Honours", Degree, fixed = TRUE), "Y", "N")]
当然,如果“荣誉”可以出现在不同的大小写变体中,您可以将您的
grepl
调用切换到grepl(“荣誉”,学位,忽略。case=TRUE)
p.S. 不过我建议您还是坚持使用逻辑向量,因为您可以在以后轻松地对其进行操作 比如说
students[, Honours := grepl("Honours", Degree, fixed = TRUE)]
现在,如果你只想选择那些有“荣誉”的人,你可以这么做
students[(Honours)]
# Student_ID Degree Honours
# 1: 10002 Honours Degree in Commerce TRUE
# 2: 10003 Bachelor of Laws (with Honours) TRUE
# 3: 10004 Bachelor of Nursing with Honours TRUE
或者那些没有“荣誉”的家伙
其实很简单
students[, Honours := c("N", "Y")[grepl("Honours", Degree, fixed = TRUE) + 1L]]
您所需要做的就是使用一些正则表达式实现函数(例如grepl
)搜索“荣誉”(这不是一个真正的表达式,因此您可以使用fixed=TREU
)提高性能),然后根据您的发现从c(“N”,“Y”)
执行向量子集设置(aTRUE
/FALSE
逻辑向量+1L,将其转换为1,2
向量,用于从c(“N”,“Y”)
中减去值)
或者,如果这太难阅读,您可以使用
ifelse
students[, Honours := ifelse(grepl("Honours", Degree, fixed = TRUE), "Y", "N")]
当然,如果“荣誉”可以出现在不同的大小写变体中,您可以将您的
grepl
调用切换到grepl(“荣誉”,学位,忽略。case=TRUE)
p.S. 不过我建议您还是坚持使用逻辑向量,因为您可以在以后轻松地对其进行操作 比如说
students[, Honours := grepl("Honours", Degree, fixed = TRUE)]
现在,如果你只想选择那些有“荣誉”的人,你可以这么做
students[(Honours)]
# Student_ID Degree Honours
# 1: 10002 Honours Degree in Commerce TRUE
# 2: 10003 Bachelor of Laws (with Honours) TRUE
# 3: 10004 Bachelor of Nursing with Honours TRUE
或者那些没有“荣誉”的家伙
为了便于阅读,您可以分步执行:
idx为了便于阅读,您可以分步执行:idx您还可以使用一个更简单的操作符%,比如来自数据的%
。table
,不过它只是grepl
的包装器。您也可以使用一个更简单的操作符%like%
。table
,尽管它是一个just wrapper overgrepl
。