我正在尝试根据CEFR(欧洲通用语言参考框架)级别计算提供特定课程的提供者的数量,其中应该有6个( A1,A2,B1,B2, C1,C2 )
数据库是由许多不同的人编译的,因此文本输入并不完全相同。这意味着我只有61个因素,而不是6个因素。
我尝试更改数据帧类,以使所有观察值均为字符,然后将包含目标表达式和多余字符(在本例中为“ A1”)的观察值替换为目标表达式,且不带空格。
我正在使用 stringr 包。
str_replace_all(ilepString$Entry.Level, "A1", "NA_Character_")
str_replace_all(ilepString$Entry.Level, "NA", "A1")
str_trim(ilepString$Entry.Level)
str_detect(ilepString$Entry.Level, "A1") #This shows me that I have failed, quite miserably, as character strings containing solely "A1" are in data obs., but entries of "A1" along with other unwanted characters, or blank space, still persist in the dataset.
我也尝试了以下方法;
gsub(“。 A0。”,“ A1”,ilepString $ Entry.Level)
但是,当我要求使用
查看数据现在的外观时 dput(head(ilepString$Entry.Level))
c("", "A1", "A1", "A2", "B1", "B2")
#Looking at the head, the output seems fine, but the following command shows the problem remains:
ilepString$Entry.Level[351:369]
[351] "A1-B1" "A2"
[353] "B1" "A2-B2"
[355] "4.5 A2" "B1"
[357] "B2" "A1-A2"
[359] "A2-B1" "A2-B2"
[361] "A1" "A2"
[363] "B1" "B2"
[365] "A1" "A2"
[367] "B1" "B2"
[369] " A1" " A2"
我希望每个条目/ obs。减少为仅一个字母和数字。
[351] "A1" "A2"
[353] "B1" "A2"
[355] "A2" "B1"
[357] "B2" "A1"
[359] "A2" "A2"
如果我对自己的解释很不好,我深表歉意。
请记住,我在R
还很新,根本没有太多线索。
答案 0 :(得分:0)
您遇到的是gsub和str_replace_all在字符串中找到模式,然后用现有字符串中的新字符串替换模式。据我所知,这些功能不支持整个字符串替换。
示例:
str_replace("Hi my name is Zach", "Zach", "John")
[1] "Hi my name is John"
因此,对于类似这样的问题,我建议要么使用str_detect来查找您需要像这样完全替换的观察值(注意:这会覆盖现有数据,并且可以修改为新的列):
ilepString$Entry.Level[str_detect(ilepString$Entry.Level, "A1")] = "A1"
或者我建议寻找类似问题的另一种方法是使用 stringdist 包进行字符串匹配。函数 amatch 将基于相似性度量(存在许多支持的匹配指标)的字符串与预定集合进行匹配。
该包作者的示例可以在此处找到:
对于您的问题,基本上您会写这样的声明:
amatch(ilepString$Entry.Level, c('A1','A2','B1','B2','C1','C2')...other inputs...)
我希望这会有所帮助,祝你好运!
答案 1 :(得分:0)
我不确定您到底想要什么。 但是我假设您想用特定的模式替换某些字符串模式。 例如,下面的代码可以将“ A0”替换为“ A1”。
我希望这会有所帮助。
numSample = 4
set.seed(5)
df = data.frame("levelOriginal" = paste0(
sample(x = c("A","B","C"), size = numSample, replace = TRUE),
floor(runif(n = numSample, min = 0, max = 3))
), stringsAsFactors = FALSE)
df$levelRevised = df$levelOriginal
df$levelRevised[grepl(pattern = "A0", x = df$levelRevised)] = "A1"
df
# levelOriginal levelRevised
# 1 A0 A1
# 2 C2 C2
# 3 C1 C1
# 4 A2 A2