Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据data.table中的逻辑字符串匹配,将值分配给新列_R_String_Data.table_Multiple Columns - Fatal编程技术网

R 根据data.table中的逻辑字符串匹配,将值分配给新列

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

我有一个很大的学生数据集,其中有非标准的优等生命名约定。我需要创建/填充一个新列,该列将返回Y或N,用于基于单词“荣誉”的字符串匹配

这是我目前的数据,有超过200000名学生

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”)
执行向量子集设置(a
TRUE
/
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”)
执行向量子集设置(a
TRUE
/
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 over
grepl