【问题标题】:gsub replaces single occurence twicegsub 替换单个出现两次
【发布时间】:2014-10-29 11:45:39
【问题描述】:

我使用以下(取自replace string in dataframe)将西班牙语单词“Si”或“Sí”替换为“Yes”

(CensResultsUnpivot <- as.data.frame(lapply(CensResultsUnpivot, function(x) if (is.character(x)|is.factor(x)) gsub("[Si|Sí]", "Yes", x) else x)))

我到处得到的结果是“YesYes”而不是“Yes”......?为什么?

【问题讨论】:

  • 离题(可能与您的数据集无关),但在某些情况下,西班牙语单词“si”的意思是“如果”。

标签: r replace gsub


【解决方案1】:

试试

  gsub("Si|Sí", "Yes", x)

而不是

 gsub("[Si|Sí]", "Yes", x)

当使用方括号时,R 将任何字符“S”和“i”替换为“Yes”,这就是你得到“YesYes”的原因

【讨论】:

  • 我认为上面的评论是对我现在删除的关于如何向量化这个的评论的回应,我现在要提交答案所以我删除了它
  • 效果更好,但仍然不完全:只有“Si”被替换(一次),但“Sí”(带重音)根本没有被替换......它与特殊字符,因为如果我使用“Si|No”,它确实会替换这两种情况......
  • 我不得不使用 \xed 来表示“带有锐角的拉丁小写字母 i”所以它变成了"Si|S\xed"
  • @intrixius,干得好,我不知道 í 的代码。 (其实在控制台写gsub("Si|Sí", "Yes", "No Sí")时,确实给了我No Yes...)
【解决方案2】:

这是更快/更好的 R 代码

testFrame <- as.data.frame(matrix(1:5,ncol=5,nrow=4))
  V1 V2 V3 V4 V5
1  1  5  4  3  2
2  2  1  5  4  3
3  3  2  1  5  4
4  4  3  2  1  5

testFrame[testFrame==1 | testFrame ==2] <- "yes"

> testFrame
   V1  V2  V3  V4  V5
1 yes   5   4   3 yes
2 yes yes   5   4   3
3   3 yes yes   5   4
4   4   3 yes yes   5

【讨论】:

  • 虽然这肯定会更快,但问题是关于gsub
  • 这与替换字符串中的字符有什么关系?
猜你喜欢
  • 2012-05-07
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
相关资源
最近更新 更多