如何根据空间创建不同的列,例如:“我要出去”
ANs 3
Column1 Column2 Column3 Column14
I am going out
答案 0 :(得分:15)
如果你想要实际的列值,如你的例子所示,那么你可以从文本连接中读取一个表:
> 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
将返回结果的列表,一个用于输入 vector s
的每个元素。 sapply
将迭代该列表,并为列表中的每个元素计算匹配数。它不使用匹配位置向量的length
进行计数,而是使用sum
仅计算非负值,从而丢弃由失败匹配引起的任何-1
。该总和中发生了从FALSE/TRUE
到0/1
的隐式转换。 sapply
的结果将再次成为一个向量,因此很好地匹配输入向量。
此功能可用于重写数据帧,如one comment中所述。因此,假设您有一个名为foo
的数据框,其中包含bar
列中的字符串,并且应修改为在新列baz
中包含这些计数。您可以将其写为
foo <- transform(foo, baz = countSpaces(bar))
答案 1 :(得分:3)
另一种方法是使用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
答案 2 :(得分: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))
答案 3 :(得分:2)
您还可以使用str_count
包中的stringr
。这些都不那么冗长,避免正则表达式会更快一些。
library(stringr)
text = "I am going Out"
#matches regular expression
str_count(text, ' ')
或者,如果你想要更快的东西
#matches literal text
str_count(text, fixed(' '))