r - 如何使用 grep 或 grepl 在数据框中创建新变量,以简化分类变量中的级别



我正在使用 grep 和 grepl 来搜索字符变量并创建简化的级别。

我试图在数据帧中获取结果。我还尝试使用 if 和 else if 语句,只指定变量。我已经附加了这段代码,并且 for if 语句没有运行。

for(i in 1:length(D$ID)){
if(grepl("Bachelor",  D$NDEGREE)[i]){D$NDegree[i] <- "Bachelors"}
else if(grepl("BS", D$NDEGREE)[i]){D$NDegree[i] <- "Bachelors"}
else if (grepl("Master", D$NDEGREE)[i]){D$NDegree[i] <- "Masters"}
else if(grepl("Doctor", D$NDEGREE)[i]){D$NDegree[i] <- "Doctors"}
else(D$NDegree[i] <- D$NDEGREE[i])}
Bachelors <-  D[grep("Bachelor", D$NDEGREE),]
BS <-  D[grep("BS", D$NDEGREE),]
Masters <- D[grep("Master", D$NDEGREE),]
Doctors <- D[grep("Doctor", D$NDEGREE),]

编辑:我也试过

D$NDEGREE <- gsub("Bachelor", "Bachelors", D$NDEGREE)
D$NDEGREE <- gsub("BS", "Bachelors", D$NDEGREE)
D$NDEGREE <- gsub("Master", "Masters", D$NDEGREE)
D$NDEGREE <- gsub("Doctor", "Doctors", D$NDEGREE)

这只是贯穿始终,但什么也没发生。 for if 语句不起作用。它只是无限期地运行。

您不必对 R 中的列进行 for 循环。只需使用矢量化操作。这是一个将函数应用于整个向量的操作。使用gsub函数重新编码值。

df <- data.frame(
NDEGREE =c("Bachelor", "Master", "Doctor", "BS"),
Value = c(1,1,1,1)
)

df$NDEGREE <- gsub("Bachelor", "Bachelors", df$NDEGREE)
df$NDEGREE <- gsub("BS", "Bachelors", df$NDEGREE)
df$NDEGREE <- gsub("Master", "Masters", df$NDEGREE)
df$NDEGREE <- gsub("Doctor", "Doctors", df$NDEGREE)

Bachelors <- df[grep("Bachelors", df$NDEGREE),]
Doctors <- df[grep("Doctors", df$NDEGREE),]
Masters <- df[grep("Masters", df$NDEGREE),]

更简单的选择(如果有很多值)是创建一个键/值数据集,然后进行模糊连接

library(fuzzyjoin)
regex_left_join(D, keyval, by = "NDegree")

数据

keyval <- data.frame(NDegree = c("Bachelor", "BS", "Master", "Doctor"), 
val = c("Bachelors", "Bachelors", "Masters", "Doctors"), 
stringsAsFactors = FALSE);

最新更新