我正在使用 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);