【问题标题】:Find the number of spaces in a string查找字符串中的空格数
【发布时间】:2012-09-13 09:31:19
【问题描述】:

如何根据空间创建不同的列,例如:“我要出去”

ANs 3
Column1 Column2 Column3 Column14 
I          am     going    out

【问题讨论】:

  • 也许你想要read.fwf 虽然我不确定你在追求什么。

标签: string r


【解决方案1】:

如果您想要实际的列值,如您的示例所示,那么您可以从文本连接中读取表格:

> read.table(textConnection("I am going Out"))
  V1 V2    V3  V4
1  I am going Out

要回答你的问题的标题,即有多少个空格,你可以使用ncol来计算上面的列,然后减一。但是,如果您对空格的数量感兴趣,则以下方法更有效:

length(gregexpr(" ", "I am going Out")[[1]])

这使用正则表达式来搜索空格。

[[1]] 获取结果列表的第一个元素,该元素对应于输入向量的第一项,其中“我要出去”作为其唯一元素。如果您在那里传递了一个不同的向量,您的列表可能有多个元素,或者对于一个空向量根本没有。

如果没有空格,gregexpr 仍然会返回一个长度为1 的列表,其中-1 作为匹配的位置,表示没有匹配。这会导致上述代码在这种情况下错误地报告一个结果。下面是一个更复杂的解决方案,它处理这个问题并接受向量作为输入:

countSpaces <- function(s) { sapply(gregexpr(" ", s), function(p) { sum(p>=0) } ) }

该函数的工作原理如下:gregexpr 将返回一个 list 结果,一个用于输入 vector s 的每个元素。 sapply 将遍历该列表,并为列表中的每个元素计算匹配数。它不计算匹配位置向量的length,而是使用sum 仅计算非负值,从而丢弃由匹配失败引起的任何-1。在该总和中发生了从 FALSE/TRUE0/1 的隐式转换。 sapply 的结果将再次成为一个向量,因此可以很好地匹配输入向量。

此函数可用于重写数据帧,如one comment 中要求的那样。因此,假设您有一个名为foo 的数据框,它在bar 列中有字符串,并且应该修改为在新列baz 中包含这些计数。你可以这样写

foo <- transform(foo, baz = countSpaces(bar))

【讨论】:

  • +1。不过,根据他们的需要,这可能更合适:length(gregexpr("[ ]+", "I am going out")[[1]])(答案 = 3)。使用该短语(带有额外空格),您使用的方法计算 每个 空格。
  • 嗯。 cmets中如何添加多个空格?
  • @mrdwab,见meta.stackexchange.com/questions/30020/…。解决方法:使用不间断空格,输入为 U+00A0 unicode 代码点。
  • 如何在数据帧上运行此代码并在同一数据集中生成一个新列。谢谢!!
  • 嘿,我试过这段代码,似乎我们得到了相同的结果,有一个空格或没有空格的条目 例如:mike waugh result = 1 和 mike result = 1........ ........该问题的任何解决方案
【解决方案2】:

另一种方法是使用strsplit函数:

R> strsplit("I am going Out", " ")[[1]]
[1] "I"     "am"    "going" "Out"  

所以我们将第一个参数 - I am going Out - 除以第二个参数 - 空白空间。那么我们就可以使用length:

R> length(strsplit("I am going Out", " ")[[1]])
[1] 4

【讨论】:

  • 但是我们不想知道字数。所以我觉得MvG的回答比较合适。
  • 我同意@MvG 的回答更好,但我不同意您对“我们不知道字数”的评论
  • 好吧,我们想知道空格的数量,而不是单词的数量。你计算字数。
  • @rinni 很好,正确的观点。我怀疑 OP 想知道字数 - 但我只是在这里猜测。
【解决方案3】:

您也可以使用stringr 包中的str_count。这些不太冗长,避免使用正则表达式可能会更快一些。

library(stringr)
text = "I am going Out"
#matches regular expression
str_count(text, ' ')

或者,如果你想要更快的东西

#matches literal text
str_count(text, fixed(' '))

【讨论】:

    【解决方案4】:

    我必须承认我没有仔细阅读,所以这可能不是你想要的,但有可能......

    x <- "I am going Out"
    nchar(x)- nchar(gsub(" ", "", x))
    

    MvG 原始建议的替代方案(虽然不那么漂亮):

    as.data.frame(matrix(unlist(strsplit("I am   going Out", "\\s+", perl=TRUE)), nrow=1))
    

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2014-05-29
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2014-05-02
      相关资源
      最近更新 更多