【问题标题】:Renaming character variables in a column in data frame - R重命名数据框中列中的字符变量 - R
【发布时间】:2018-11-09 22:11:39
【问题描述】:

我有一个数据框,其中包含一个名为 ProjectSubject 的列。数据框大约有 1,000,000 行长。

在 ProjectSubject 列中,我有很多不同的字符串。这是一个例子:

>unique(unlist(projectdf$ProjectSubject))

[1] "Applied Learning"                           "Applied Learning, Literacy 
& Language"     
[3] "Literacy & Language"                        "Special Needs"                             
[5] "Literacy & Language, History & Civics"      "Math & Science"                            
[7] "History & Civics, Math & Science"           "Literacy & Language, 
Special Needs"        
[9] "Applied Learning, Special Needs"            "Health & Sports, Special 
Needs"            
[11] "Math & Science, Literacy & Language"        "Literacy & Language, Math 
& Science"       
[13] "Literacy & Language, Music & The Arts"      "Math & Science, Special 
Needs"             
[15] "Health & Sports"                            "Music & The Arts"                          
[17] "Math & Science, Applied Learning"           "Literacy & Language, 
Applied Learning"     
[19] "Applied Learning, Music & The Arts"         "History & Civics, 
Literacy & Language"     
[21] "Applied Learning, Math & Science"           "Health & Sports, Math & 
Science"           
[23] "Applied Learning, Health & Sports"          "History & Civics"                          
[25] "History & Civics, Music & The Arts"         "Math & Science, History & 
Civics"          
[27] "Math & Science, Music & The Arts"           "Special Needs, Music & 
The Arts"           
[29] "History & Civics, Applied Learning"         "History & Civics, Special 
Needs"           

我需要一种简洁、非手动的方式来遍历数据框中的整个列,并用不同的字符串替换这些字符串。例如,我想将“Applied Learning, Special Needs”替换为“Special Needs”,或者类似地将“Applied Learning, Math & Science”替换为“Math”。

我有大约 50 个唯一字符串,很像上面给出的示例代码,我想将其减少到大约 10 个唯一字符串。最好有一种方法,我不必为 50 个字符串中的每一个手动键入一行代码就不必这样做。

【问题讨论】:

    标签: r dataframe character rename


    【解决方案1】:

    这是我认为不错的一种方式:

    # first create some fake data that approximates your situation
    set.seed(6933)
    
    fruit_words <- c("apple", "orange", "banana", "pappels", "orong", "bernaner")
    
    dat <- data.frame(fruit = sample(fruit_words, size=10, replace=TRUE), 
                      stringsAsFactors=FALSE)
    

    创建一个表,将dat$fruit 的每个唯一值与您要替换它的所需类别/字符串相关联:

    fruit_lkup <- c(apple="appl", orange="orng", banana="bnna", 
                    pappels="appl", orong="orng", bernaner="bnna")
    

    然后利用dat$fruit 拥有fruit_lkup 的名称这一事实

    dat$fruit_clean <- as.character(fruit_lkup[dat$fruit])
    

    结果如下:

    print(dat)
    ##       fruit   fruit_clean
    ## 1   pappels        appl
    ## 2     orong        orng
    ## 3     apple        appl
    ## 4    banana        bnna
    ## 5     apple        appl
    ## 6  bernaner        bnna
    ## 7  bernaner        bnna
    ## 8   pappels        appl
    ## 9  bernaner        bnna
    ## 10 bernaner        bnna
    

    所以实际上大部分工作都在于创建用于查找值的对象 -- fruit_lkup

    开始的一种方法是使用dput(unique(dat$fruit)),然后将其粘贴到脚本中,然后开始提供要替换的值。

    如果唯一值太多,您也可以将唯一值写入 csv,然后在它们之后手动添加要替换的值。然后你可以读入(现在)两列 csv 作为数据框(比如lookup_df),并使用fruit_lkup &lt;- setNames(lookup_df$new_values, lookup_df$old_values) 创建fruit_lkup

    我多次发现这种方法非常方便,基本上与您描述的情况完全相同。

    希望对你有帮助~~

    【讨论】:

    • 我发现这个答案是最好的。这很简单,不需要 tidyverse 或其他依赖项。
    • @Blacklivesmatter 很高兴听到,这就是意图!基础 R 被低估了:p
    【解决方案2】:

    如果您已经知道要更改哪些字符串,一种解决方案可能是使用gsub

    projectdf$ProjectSubject <- gsub("Applied Learning, Special Needs", "Special Needs", projectdf$ProjectSubject)
    

    这会将字符串“Applied Learning, Special Needs”更改为“Special Needs”。调用 50 个gsub 可能会很乏味,因此一些聪明的正则表达式可能有助于解决这个问题。例如,如果任何字符串都包含“Special Needs”,改为“Special Needs”:

    projectdf$ProjectSubject <- gsub("^.*?Special Needs", "Special Needs", projectdf$ProjectSubject)
    

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 2012-04-28
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多