У меня есть набор фреймов данных, где в каждом есть несколько вхождений одной и той же строки в столбце, но они действительно отражают разные наблюдения.
library(dplyr)
govs <- c("Government", "Federal", "General government", "Government enterprises", "State and local",
"General government", "Government enterprises")
df <- data.frame("gov_levels" = govs, revenue = rnorm(7, mean = 1000, sd = 50))
df
Я хотел бы заменить (или объединить) каждое вхождение другим шаблоном, чтобы они стали различимыми. Этот код вернет желаемый результат,
df %>%
mutate(gov_levels = stri_replace_first_fixed(str = gov_levels, pattern = "General government",
replacement = c("Federal general government",
"State and local general government")))
, но он не согласован в зависимости от того, находится ли «Сектор государственного управления» в четной или нечетной строке, как показано на рисунке, когда я удаляю первую строку перед изменением:
df %>%
filter(gov_levels != "Government") %>%
mutate(gov_levels = stri_replace_first_fixed(str = gov_levels, pattern = "General government",
replacement = c("Federal general government",
"State and local general government")))
В результате замены происходят в неправильном порядке. Я ищу способ применять это последовательно, чтобы он не зависел от положения строк заменяемых строк. Таким образом, первый матч всегда будет заменен на Федеральное Государственное управление, а второй будет всегда заменяться Государственное и местное Государственное управление.
ОБНОВЛЕНИЯ НА ОСНОВЕ GEORGE'S ОТВЕТ. Список фреймов данных с некоторыми несоответствиями:
govs <- c("Government", "Federal", "General government", "Government enterprises", "State and local",
"General government", "Government enterprises", NA, NA)
df1 <- data.frame("col_1" = "col1data", "gov_levels" = govs, revenue = c(rnorm(7, mean = 100, sd = 50), NA, NA), stringsAsFactors = FALSE)
df2 <- data.frame("col_1" = "col1data", "gov_types" = govs, revenue = c(rnorm(7, mean = 100, sd = 50), NA, NA), stringsAsFactors = FALSE)
df2 <- df2 %>%
filter(gov_types != "Government")
df_list <- list(df1, df2)
И реализация решения Джорджа с помощью lapply для решения других упомянутых мной проблем - мне любопытно, если есть лучший способ подойти к этому?
newlevels_gen <- c("Federal general government", "State and local general government")
df_list <- lapply(df_list,
function(x) {x[, 2] <- as.factor(x[, 2])
return(x)
}
)
df_list <- lapply(df_list, function(x) {levels(x[,2]) <- c(levels(x[,2]), newlevels_gen)
return(x)
}
)
df_list_clean_a <- lapply(df_list, function(x) {x[,2][!is.na(x[,2]) & x[,2] == "General government"] <- newlevels_gen
return(x)
}
)