9

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

ANs 3
Column1 Column2 Column3 Column14 
I          am     going    out
4

4 回答 4

17

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

> 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]]元素对应于输入向量的第一项,其中“I am going Out”作为其唯一元素。如果你在那里传递了一个不同的向量,你的列表可能有多个元素,或者对于一个空向量根本没有。

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

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

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

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

foo <- transform(foo, baz = countSpaces(bar))
于 2012-09-13T09:34:54.107 回答
5

另一种方法是使用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
于 2012-09-13T09:46:00.587 回答
4

您也可以str_countstringr包装中使用。这些不那么冗长,避免正则表达式可能会更快一些。

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

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

#matches literal text
str_count(text, fixed(' '))
于 2017-12-14T19:45:35.353 回答
3

我必须承认我没有真正仔细阅读所以这可能不是你所追求的,但有可能是......

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))
于 2012-09-13T14:43:53.553 回答