通过循环在列之间应用新级别

时间:2015-06-24 19:27:42

标签: r for-loop

为这个问题道歉我怀疑答案很简单,但我找不到解决办法。

我有一个包含一组列的数据框,我想清理它们。

数据框中的列名是:    工作表$ 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循环是采取的方法。

1 个答案:

答案 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)