我有一个包含名为ProjectSubject的列的数据框。数据框大约有1,000,000行。
在ProjectSubject列中,我有许多不同的字符串。这是一个例子:
"[\\r\\n ]+"
我需要一种简洁,非手动的方式来遍历数据框中的整个列,并用不同的字符串替换这些字符串。例如,我想取代"应用学习,特殊需求"与#34;特殊需求"或类似地取代"应用学习,数学&科学"用"数学"。
我有大约50个独特的字符串,就像上面给出的示例代码一样,我想减少到大约10个唯一字符串。优选地,有一种方法,我不必这样做,而无需为50个字符串中的每一个手动键入一行代码。
答案 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)