为这个问题道歉我怀疑答案很简单,但我找不到解决办法。
我有一个包含一组列的数据框,我想清理它们。
数据框中的列名是: 工作表$ abx.1一直到工作表$ abx.9(这些列不是连续的)
abx.1 <- c('tazocin', 'pip-tazo', 'piperacillin')
start.1 <- as.Date(c ('2010-01-01', '2010-01-07', '2010-01-22'))
abx.2 <- c('vancomcyin', 'ciprofloxacin', 'piperacillin')
start.2 <- as.Date(c ('2010-01-01', '2010-01-07', '2010-01-22'))
worksheet <- data.frame(abx.1, start.1, abx.2, start.2)
我想在所有“abx”列中应用以下代码。
levels(worksheet$abx.1)[levels(worksheet$abx.1) %in% c("Cefazolin", 'IV Cefazolin', 'cefazolin')] <- "cefazolin"
levels(worksheet$abx.1)[levels(worksheet$abx.1) %in% c("Ceftriaxone", 'ceftriaxone', 'IV Ceftriaxone')] <- "ceftriaxone"
levels(worksheet$abx.1)[levels(worksheet$abx.1) %in% c("Cefuroxime Axetil", 'Cefuroxime')] <- "cefuroxime"
levels(worksheet$abx.1)[levels(worksheet$abx.1) %in% c("Piperacillin/Taz", "pip-tazo", 'Pip-tazo', 'Pip-Tazo' )] <- "pip-tazo"
levels(worksheet$abx.1)[levels(worksheet$abx.1) %in% c('moxifloxacin', 'Moxifloxacin')] <- "moxifloxacin"
有一种简单的方法吗?我假设一个for循环是采取的方法。
答案 0 :(得分:2)
我可能会先简化重新编码。如果您在列表中定义替换
newlevels <- list(
"cefazolin" = c("Cefazolin", 'IV Cefazolin', 'cefazolin'),
"ceftriaxone" = c("Ceftriaxone", 'ceftriaxone', 'IV Ceftriaxone'),
"cefuroxime" = c("Cefuroxime Axetil", 'Cefuroxime'),
"pip-tazo" = c("Piperacillin/Taz", "pip-tazo", 'Pip-tazo', 'Pip-Tazo' ),
"moxifloxacin" = c('moxifloxacin', 'Moxifloxacin')
)
我们还可以定义一个辅助函数来替换级别
swaplevels <- function(x, value) {
untouched<-setdiff(levels(x), unlist(value))
newcodes<-c(setNames(as.list(untouched), untouched), value)
levels(x)<-newcodes
x
}
请注意,这类似于levels<-
的内置函数,但我们添加了一个保留不在重新分配列表中的级别的情况。如果您不需要该功能,则可以直接使用levels<-
。最后,我们可以使用
abx
列
abxcols <- grep("^abx",colnames(worksheet))
worksheet[, abxcols] <- lapply(worksheet[,abxcols], swaplevels, newlevels)