代码之家  ›  专栏  ›  技术社区  ›  Chris Ruehlemann

在一个go-in r中对多个列执行转换

r
  •  1
  • Chris Ruehlemann  · 技术社区  · 6 年前

    我有一个数据框架,其中有多列用于Word表单标记,如本模拟示例所示:

    df <- data.frame(
       w1 = c("NN1", "NN0", "ADJ", "ADC", "NP0", "VVZ"),
       w2 = c("NN0", "NN2", "ADC", "NN0", "VBN", "NN1"),
       w3 = c("ADJ", "NN2", "NP0", "VVG", "ADS", "NN1"),
       w4 = c("NN2", "NN2", "ADJ", "ADJ", "ADS", "VVD")
     )
    df
    

    现在,我想使用更广泛的描述对标签进行重新分类,例如单数名词的“名词”(标记为“nn1”)、复数名词的“nn2”)、专有名词的“np0”等。我可以一列一列地进行转换,如下所示:

    df$w1_class <- ifelse(grepl("^N", df$w1), "noun", 
                          ifelse(grepl("^V", df$w1), "verb", "adjective"))
    df$w2_class <- ifelse(grepl("^N", df$w2), "noun", 
                          ifelse(grepl("^V", df$w2), "verb", "adjective"))
    df$w3_class <- ifelse(grepl("^N", df$w3), "noun", 
                          ifelse(grepl("^V", df$w3), "verb", "adjective"))
    df$w4_class <- ifelse(grepl("^N", df$w4), "noun", 
                          ifelse(grepl("^V", df$w4), "verb", "adjective"))
    

    如果有更多这样的列和更多的标记类型,就像我在真实数据框架中所做的那样,那么考虑到高度重复的代码,这是一个冗长的练习。转换可以一次性完成吗?

    2 回复  |  直到 5 年前
        1
  •  2
  •   MKR    6 年前

    一种解决方案使用 dplyr::mutate_all dplyr::case_when 可以是:

    library(dplyr)
    
    df %>% mutate_all(funs(case_when(
      grepl("^N", .) ~ "noun",
      grepl("^V", .) ~ "verb",
      grepl("^A", .) ~ "adjective",
      TRUE           ~ "Other"
                     )))
    
    #          w1        w2        w3        w4
    # 1      noun      noun adjective      noun
    # 2      noun      noun      noun      noun
    # 3 adjective adjective      noun adjective
    # 4 adjective      noun      verb adjective
    # 5      noun      verb adjective adjective
    # 6      verb      noun      noun      verb
    

    数据:

    df <- data.frame(
      w1 = c("NN1", "NN0", "ADJ", "ADC", "NP0", "VVZ"),
      w2 = c("NN0", "NN2", "ADC", "NN0", "VBN", "NN1"),
      w3 = c("ADJ", "NN2", "NP0", "VVG", "ADS", "NN1"),
      w4 = c("NN2", "NN2", "ADJ", "ADJ", "ADS", "VVD")
    )
    
        2
  •  3
  •   Alexis    5 年前

    您可以将映射逻辑放入函数中,然后使用 dplyr::mutate_all 以下内容:

    library(dplyr)
    
    df <- data.frame(
        w1 = c("NN1", "NN0", "ADJ", "ADC", "NP0", "VVZ"),
        w2 = c("NN0", "NN2", "ADC", "NN0", "VBN", "NN1"),
        w3 = c("ADJ", "NN2", "NP0", "VVG", "ADS", "NN1"),
        w4 = c("NN2", "NN2", "ADJ", "ADJ", "ADS", "VVD"),
        stringsAsFactors = FALSE
    )
    
    foo <- function(tags) {
        tags <- sub("^N.*", "noun", tags)
        tags <- sub("^V.*", "verb", tags)
        tags <- sub("^A.*", "adjective", tags)
        tags
    }
    
    out <- df %>%
      mutate_all(foo) %>%
      rename_all(~paste0(., "_class"))