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