在R中更改数据框中某一列的字符变量名称

6

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

在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个字符串中的每一个手动键入一行代码。
2个回答

5

我认为以下方式非常不错:

# 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 <- setNames(lookup_df$new_values, lookup_df$old_values)创建fruit_lkup。我发现这种方法在很多时候都非常方便,基本上与您描述的情况完全相同。希望这有所帮助~~

1
我发现这个答案是最好的。它很简单,不需要 tidyverse 或其他依赖项。 - ecology
1
@Blacklivesmatter 很高兴听到这个消息,那正是我的意图!基础 R 太被低估了 :p - lefft

1
如果您已经知道要更改的字符串,一种解决方案可能是使用 gsub
projectdf$ProjectSubject <- gsub("Applied Learning, Special Needs", "Special Needs", projectdf$ProjectSubject)

这将把字符串“Applied Learning,Special Needs”更改为“Special Needs”。使用50个调用可能会很繁琐,因此一些聪明的正则表达式可能有助于解决这个问题。例如,如果任何字符串都包含“Special Needs”,则更改为“Special Needs”。
projectdf$ProjectSubject <- gsub("^.*?Special Needs", "Special Needs", projectdf$ProjectSubject)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接