r函数将无法识别字符串

时间:2017-05-09 13:42:14

标签: r regex character-encoding

我有一个从.csv读取的调查数据的大数据框,在简化时看起来像这样。

x <- data.frame("q1" = c("yes","no","don’t_know"),
            "q2" = c("no","no","don’t_know"),
            "q3" = c("yes","don’t_know","don’t_know"))

我想使用rowSums创建一个列,如下所示

x$dntknw<-rowSums(x=="don’t_know")

我可以轻松地为所有yesno答案执行此操作,但在我的数据框中,它只为don’t_know生成零。 我之前有一个撇号的问题,看起来像don’t_know。我已将encoding = "UTF-8"添加到read.table以解决此问题。但是现在我似乎无法让任何R函数识别它,我尝试了gsub("’","",df)但这与rowSums一样无效。 这是编码的问题吗?是否有正则表达式解决方案来删除它们?有什么解决方案来解决这个问题?

2 个答案:

答案 0 :(得分:1)

这是一个编码问题,而不是正则表达式。我无法重现该问题,我的编码在R中设置为UTF-8。尝试将编码设置为默认R中的UTF-8,而不是在读取时。

这是我的代码输出示例。

> x
         q1          q2         q3 dntknw
1        yes         no        yes      0
2         no         no don’t_know      1
3 don’t_know don’t_know don’t_know      3

> Sys.setlocale()
[1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8"

以下是一些可能有用的细节。 https://support.rstudio.com/hc/en-us/articles/200532197-Character-Encoding

答案 1 :(得分:1)

正如@Drj所说,这可能是编码错误。当我将代码粘贴到我的控制台时,我得到了

> x$q1
[1] yes             no              don<U+0092>t_know

即使编码关闭,您仍然可以使用正则表达式匹配它:

grepl("don.+t_know", x$q1)
# [1] FALSE FALSE  TRUE

因此,您可以按如下方式计算行总和:

x$dntknw <- rowSums(apply(x, 2, function(y) grepl("don.+t_know", y)))

结果是

> x
                 q1                q2                q3 dntknw
1               yes                no               yes      0
2                no                no don<U+0092>t_know      1
3 don<U+0092>t_know don<U+0092>t_know don<U+0092>t_know      3