Mar*_*cel 5 r rename character dataframe
我有一个数据框,其中包含一个名为 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"
Run Code Online (Sandbox Code Playgroud)
我需要一种简洁的非手动方式来遍历数据框中的整个列,并用不同的字符串替换一堆这些字符串。例如,我想将“应用学习、特殊需求”替换为“特殊需求”,或者类似地将“应用学习、数学和科学”替换为“数学”。
我有大约 50 个唯一字符串,很像上面给出的示例代码,我想减少到大约 10 个唯一字符串。最好有一种方法,我不必为 50 个字符串中的每个字符串手动输入一行代码。
这是我认为不错的方法:
# 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)
Run Code Online (Sandbox Code Playgroud)
创建一个表,将 的每个唯一值dat$fruit与要替换它的所需类别/字符串相关联:
fruit_lkup <- c(apple="appl", orange="orng", banana="bnna",
pappels="appl", orong="orng", bernaner="bnna")
Run Code Online (Sandbox Code Playgroud)
dat$fruit然后利用包含以下名称的事实fruit_lkup
dat$fruit_clean <- as.character(fruit_lkup[dat$fruit])
Run Code Online (Sandbox Code Playgroud)
结果如下:
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
Run Code Online (Sandbox Code Playgroud)
因此,实际上大部分工作在于创建用于查找值的对象 - fruit_lkup。
一种开始方法是使用dput(unique(dat$fruit)),然后将其粘贴到脚本中,并开始提供要替换的值。
如果唯一值太多,您还可以将唯一值写入 csv,然后在其后手动添加要替换的值。然后您可以将(现在)两列 csv 作为数据框读取(例如lookup_df),并fruit_lkup使用fruit_lkup <- setNames(lookup_df$new_values, lookup_df$old_values)
我多次发现这种方法非常方便,基本上与您描述的情况完全相同。
希望这有帮助~~