重命名数据框中列中的字符变量 - R.

时间:2018-05-31 00:37:04

标签: r dataframe character rename

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

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

"[\\r\\n ]+"

我需要一种简洁,非手动的方式来遍历数据框中的整个列,并用不同的字符串替换这些字符串。例如,我想取代"应用学习,特殊需求"与#34;特殊需求"或类似地取代"应用学习,数学&科学"用"数学"。

我有大约50个独特的字符串,就像上面给出的示例代码一样,我想减少到大约10个唯一字符串。优选地,有一种方法,我不必这样做,而无需为50个字符串中的每一个手动键入一行代码。

2 个答案:

答案 0 :(得分:0)

这是我认为很好的方式:

# 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

创建fruit_lkup <- setNames(lookup_df$new_values, lookup_df$old_values)

我发现这种方法很多次都非常方便,基本上就是你所描述的情况。

希望这有帮助~~

答案 1 :(得分:0)

如果您已经知道要更改哪些字符串,则可以使用gsub

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

这会将“应用学习,特殊需求”字符串更改为“特殊需求”。对于50 gsub次调用可能会很乏味,因此一些聪明的正则表达式可能有助于解决该问题。例如,如果任何字符串包含“特殊需求”,请更改为“特殊需求”:

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