Как создать новую переменную во фрейме данных, используя grep или grepl, чтобы упростить уровни в категориальной переменной - PullRequest
0 голосов
/ 10 июня 2019

Я использую 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 не работает. он просто продолжает работать бесконечно.

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Более простой вариант (если имеется много значений) - создать набор данных key / val, а затем выполнить нечеткое соединение

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);
1 голос
/ 10 июня 2019

Вам не нужно зацикливаться на столбце в R. Просто используйте векторизованные операции. Это операция, которая применяет функцию ко всему вектору. Используйте функцию 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),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...